javascript - 为什么 'amd'函数中有 'define'属性?

标签 javascript jquery backbone.js requirejs amd

我正在学习 jQuery 和 Backbone 源代码,并注意到他们检查是否有 requirejs:

jQuery 1.9.1

if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
    define( "jquery", [], function () { return jQuery; } );
}

Backbone

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/

相关文章:

jquery - 为什么替换 html 时的 Backbone 事件不起作用?

javascript - 从网页打开应用程序

javascript - Backbone - 集合中所有模型的聚合器事件触发

javafx 2 javascript api - 获取 java Controller

javascript - 访问 json 数据时出现问题

javascript - 如何让 div 粘在另一个元素上

javascript - 将动态 JSON 数组转换为 HTML

javascript - Backbone.js中如何使用groupBy对集合进行分组?

javascript - 按日期过滤时Mongodb时区问题

javascript - 输入字段未附加到 td