我们可以使用AMD兼容版本的BackboneJS和UnderscoreJS
我查看了AMD兼容库中的两个(https://github.com/amdjs/),以下是使它们与AMD兼容的相关代码。
BackboneJS(AMD);
else if (typeof define === 'function' && define.amd) {
// AMD
define(['underscore', 'jquery', 'exports'], function(_, $, exports) {
// Export global even in AMD case in case this script is loaded with
// others that may still expect a global Backbone.
root.Backbone = factory(root, exports, _, $);
});
UnderscoreJS(AMD);
// AMD define happens at the end for compatibility with AMD loaders
// that don't enforce next-turn semantics on modules.
if (typeof define === 'function' && define.amd) {
define('underscore', function() {
return _;
});
}
现在我们在代码中使用这些AMD兼容的库,我们说;
requirejs.config({
enforceDefine: true,
paths: {
"jquery": "libs/jquery-1.8.3",
"underscore": "libs/underscore-amd",
"backbone": "libs/backbone-amd"
}
});
现在我读到骨干模块的名称可以是任何名称,但下划线的名称必须是“下划线”,对于下划线,大小写很重要。
我无法理解为什么区别于库的定义差异。
请你解释一下。
答案 0 :(得分:2)
可以使用或不使用正在定义的模块的名称调用define
函数。此调用没有模块名称。它从一系列依赖项开始:
define(['underscore', 'jquery', 'exports'], function(_, $, exports) {
RequireJS将根据define
出现的文件的基本名称或基于您在paths
配置中提供的名称来分配模块名称。你可以放paths: { platypus: '... path to file' }
,你的模块名为platypus
。
此调用具有模块名称:
define('underscore', function() {
将模块命名为underscore
。 (第一个参数不是数组,因此RequireJS将其解释为模块名称。)当名称设置为define
时,它永远不会改变。因此,当您将其作为依赖项时,必须将其称为underscore
。 (您可以在RequireJS配置中使用map
重新映射名称,但最终模块名称固定为underscore
。)如果您使用此模块尝试了上面的platypus
示例,则RequireJS将生成一个错误,因为它会找到一个名为underscore
但没有名为platypus
的模块。
在没有明确和实质原因的define
来电中指定模块名称是不良做法。 RequireJS recommends的文档没有这样做:
这些[即模块名称]通常由优化工具生成。您可以自己明确命名模块,但它使模块的可移植性降低 - 如果将文件移动到另一个目录,则需要更改名称。通常最好避免使用模块名称进行编码,只需让优化工具在模块名称中进行刻录。优化工具需要添加名称,以便可以在文件中捆绑多个模块,以便在浏览器中加快加载速度。