为什么在requirejs模块中传递对jQuery的引用是可选的?例如,请考虑以下代码与第一行的不同版本
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){
那么你不必包含$引用,否则它会认为ClassA引用['jquery']依赖?
那么,为什么它是可选的,更重要的是,这是最佳实践?
//编辑
抱歉,这意味着要添加配置详细信息require.config({
paths: {
"jquery": "//cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min"
}
});
答案 0 :(得分:1)
不应该将其视为"可选"。始终将AMD模块的结果绑定到参数。
在这种情况下,当通过AMD加载jQuery时,jQuery是而不是调用noConflict
,所以它仍然是clobbers window.$
。这就是它"工作"即使它没有绑定到$
参数。
根据end of the source file评论中的措辞,可能是AMD垫片(或模块)会调用noConflict
本身:
// 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.
将jQuery(或任何其他模块,包括不会返回有用值的jQuery插件等)一致地绑定到参数。这将避免定义列表中的混淆和不匹配。 (使用多个版本的jQuery是有潜在危险的。)
就个人而言,我通过<script>
加载jQuery并将其填充到AMD模块中,因为我喜欢控件。我还手动调用noConflict
,因此我需要以$
作为参数进行访问。
答案 1 :(得分:0)
虽然jQuery将自己定义为AMD模块,但它也将jQuery
和$
导出到全局命名空间(如果需要,每个模块都可以这样做,但是没有人这样做,因为这正是与模块化事物相反)。我不知道有什么优势,但似乎认为它将帮助开发人员使用混合AMD /全局代码。
以下是对jQuery的这种行为的一个很好的解释:https://github.com/cujojs/curl/wiki/Using-curl.js-with-jQuery#-and-jquery-are-still-available-as-global-variables