Mik*_*Dev 6 javascript jquery requirejs
我是RequireJS菜鸟.当我使用"require.config"并包含一个名称与jQuery不同的jQuery路径时,结果不符合预期.
这是一个非常简单的例子来帮助解释我的问题.
文件结构
root
??? Index.htm
??? scripts
??? libs
? ??? jquery-1.7.1.js
? ??? require.js
??? main.js
??? someModule.js
Run Code Online (Sandbox Code Playgroud)
index.htm的
<html>
<head>
<title>BackboneJS Modular app with RequireJS</title>
<script data-main="scripts/main" src="scripts/libs/require.js"></script>
</head>
<body>
<h3>BackboneJS is awesome</h3>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
这里脚本标记引用了scripts/libs中的require.当require运行时,应该执行脚本目录中名为main.js的JavaScript文件.
main.js
require.config({
"paths": {
"mod1": "someModule"
}
});
require(["mod1"], function (sm) {
console.log(sm.someValue);
});
Run Code Online (Sandbox Code Playgroud)
根据我的经验,"mod1"可以是任何东西,只要它在require.config路径和require方法中引用相同即可.
someModule.js
define([], function () {
console.log();
return { someValue: "abcd" };
});
Run Code Online (Sandbox Code Playgroud)
为了完整起见,我收录了someModule.js
当我包含JQuery时,会出现感觉到的不稳定.
在下面的main.js中,我将jQuery添加到config和require方法中.
Main.js
require.config({
"paths": {
"jquery": "libs/jquery-1.7.1"
,"mod1": "someModule"
}
});
require(["mod1", "jquery"], function (sm, $) {
console.log(sm.someValue);
console.log($);
});
Run Code Online (Sandbox Code Playgroud)
随着jQuery的增加,一切似乎仍然有效."console.log($)"编写了jQuery函数.
现在是踢球者.在下面的代码中,我在路径和require中将"jquery"更改为"jqueryA"
require.config({
"paths": {
"jqueryA": "libs/jquery-1.7.1"
,"mod1": "someModule"
}
});
require(["mod1", "jqueryA"], function (sm, $) {
console.log(sm.someValue);
console.log($);
});
Run Code Online (Sandbox Code Playgroud)
现在"console.log($)"写入null.
这应该是预期的吗?这个名称必须是jquery的原因是什么,但对于mod1,它可以是什么?
我可以毫无问题地解决这个问题,但这个问题看起来很奇怪.我知道我可以使用组合的RequireJS和jQuery文件,但是当jQuery有更新时,我不想依赖于RequireJS来包含新的jQuery.
在jQuery 1.7中,他们决定支持AMD加载.为此,它定义了一个名为"jquery"的模块,该模块将对jQuery对象的引用传回.当你用另一个名字(例如'jqueryA')定义你的jquery路径时,事情并没有像你想象的那样完全破坏.
jquery脚本始终将自己定义为名为"jquery"的模块,该模块已在app中注册了require.当您命名路径快捷方式'jquery'并且'jquery'作为依赖项加载时,require实际上引用了由jquery-1.7.1.js定义的'jquery'模块,该模块确实传回了正确的引用.当您命名模块快捷方式jqueryA时,您现在引用了未定义的引用,因为除了通过名为"jquery"的模块之外,jquery脚本本身不会传回引用.我知道,这很愚蠢.
jquery脚本将模块定义为'jquery',并期望您只需将其引用为'jquery'.如果您想将其作为另一个名称引用(并且作为奖励,使其不与其他加载的jquery库冲突),请使用以下方法:
使用requirejs和jquery,而不是破坏全局jquery?