我正在学习 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中的define
函数中总是有一个amd
属性?
并且define.amd
始终是一个jQuery
键为true
的对象?即使我还没有导入 jQuery 模块?
最佳答案
这是 AMD 加载程序应使用的约定,以指示它们导出到全局空间的 define
是由 AMD 模块使用的 define
定义自己。
如果 AMD 加载器不使用此约定,那么如果某个随机 JavaScript 库决定将 define
函数导出到与 AMD 无关的全局空间,则设计为与 AMD 一起使用的代码或者如果没有 AMD 加载程序,则会错误地认为它们是在存在 AMD 加载程序的环境中使用的。
如果某个随机的第三方库决定也导出自己的 define
函数(与定义 AMD 模块无关),那么仍然存在出现问题的风险和 决定向其添加 amd
属性,但风险比不使用我上面解释的方案要低得多。
因此,您显示的代码中的 jQuery 和 Backbone 会测试它是否在存在 AMD 加载程序的 AMD 环境中使用,如果是,则将其自身定义为 AMD 模块。
define.amd.jQuery
特定于 jQuery,表示加载器能够考虑同时加载多个版本的 jQuery。
关于javascript - 为什么 'amd'函数中有 'define'属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23247750/