Javascript 为什么在require/AMD模块中传递jquery引用是可选的?
为什么在requirejs模块中传递对jQuery的引用是可选的?例如,考虑下面的代码,不同版本的拳头线Javascript 为什么在require/AMD模块中传递jquery引用是可选的?,javascript,jquery,requirejs,amd,Javascript,Jquery,Requirejs,Amd,为什么在requirejs模块中传递对jQuery的引用是可选的?例如,考虑下面的代码,不同版本的拳头线 define(['jquery'],function ($) { var initialize=function(){ console.log($.fn.jquery); }; return { initialize: initialize }; }); 对于这一行,您希望console.log能够正常工作 define
define(['jquery'],function ($) {
var initialize=function(){
console.log($.fn.jquery);
};
return {
initialize: initialize
};
});
对于这一行,您希望console.log能够正常工作
define(['jquery'],function ($) { ...
“jquery”被加载并传递到后面的代码中,其中$作为引用
对于这一行,您可能希望console.log失败
define(function () { ...
但是为什么这一行可以工作呢?即为什么console.log知道$是什么
define(['jquery'],function () {
现在我想你会说。。。因为您正在使用全局引用来查询$,但这不是有点。。。不安全的?如果$在全球范围内可用,为什么您仍然需要['jquery']依赖项呢?如果您正在做这样的事情呢
define(['jquery','classA','classB] ...
如果你继续
define(['jquery','classA','classB],function(ClassA,ClassB){
那么您不需要包含$reference,否则它会认为ClassA引用了['jquery']依赖项吗
那么,为什么它是可选的,更重要的是,哪一个是最佳实践
//编辑
抱歉,我的意思是添加配置详细信息
require.config({
})) 不应将其视为“可选”。始终将AMD模块的结果绑定到参数 在这种情况下,当通过AMD加载时,jQuery没有调用
noConflict
,因此它仍然会关闭窗口。$
。这就是为什么即使它没有绑定到$
参数,它也会“工作”的原因
据推测,AMD垫片(或模块)将根据以下注释中的措辞调用noConflict
:
一致地将jQuery(或任何其他模块,包括不返回有用值的jQuery插件)绑定到参数。这将避免定义列表中的混乱和不匹配。(使用多个版本的jQuery有潜在危险。)
就我个人而言,我通过
加载jQuery并将其填充到AMD模块中,因为我喜欢这个控件。我还手动调用noConflict
,因此需要通过绑定为参数的$
来访问它。尽管jQuery将自己定义为AMD模块,但它也将其jQuery
和$
导出到全局命名空间(如果他们愿意,每个模块都可以做到,但没有人做到,因为这与模块化正好相反)。我不知道有什么好处,但他们似乎认为这将有助于使用混合AMD/globals代码的开发人员
下面是jQuery这种行为的一个很好的解释:
paths: {
"jquery": "//cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min"
}
// Do this after creating the global so that if an AMD module wants to call
// noConflict to hide this version of jQuery, it will work.