我正在学习jQuery和Backbone源代码,并注意到他们检查是否有requirejs:
if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
define( "jquery", [], function () { return jQuery; } );
}
if (typeof define === 'function' && define.amd) {
define(['underscore', 'jquery', 'exports'], function(_, $, exports) {
为什么requirejs中的amd
函数中始终有define
个属性?
define.amd
始终是一个键jQuery
为true
的对象?即使我没有导入jQuery模块?
答案 0 :(得分:2)
AMD加载程序应该使用它来表示它们导出到全局空间的define
是由AMD模块用来定义自己的define
。
如果AMD加载器没有使用此约定,那么如果某个随机JavaScript库决定将define
函数导出到与AMD无关的全局空间中,那么代码可以使用或不使用AMD加载器会错误地认为它们是在存在AMD加载器的环境中使用的。
如果某个随机第三方库决定也导出其自己的define
函数(与定义AMD模块无关),那么事情仍然存在风险,和决定为它添加一个amd
属性,但风险远远低于我上面解释的方案没有使用。
因此,您所展示的代码中的jQuery和Backbone测试它是否用于存在AMD加载程序的AMD环境中,如果是这样,则将其自身定义为AMD模块。
define.amd.jQuery
特定于jQuery,表示加载器能够解释同时加载的多个版本的jQuery。