我们可以使用与AMD兼容的BackboneJS和UnderscoreJS版本
[我在(https://github.com/amdjs/)中都看到了AMD兼容库,下面是使它们与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"
}
});
现在我读到骨干模块的名称可以是任何东西,但是下划线的名称必须是“下划线”,而对于下划线,大写字母很重要。
为什么基于库的定义有何不同?
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的文档没有这样做:
这些[即模块名称]通常是由优化工具生成的。您可以自己为模块明确命名,但这会使模块的可移植性降低-如果将文件移动到另一个目录,则需要更改名称。通常最好避免为模块名称编码,而让优化工具以模块名称刻录。优化工具需要添加名称,以便一个文件中可以捆绑多个模块,以允许在浏览器中更快地加载。