我们可以使用AMD兼容版本的BackboneJS和UnderscoreJS
我在AMD兼容库中查找了两者(https://github.com/amdjs/),下面是使它们与AMD兼容的相关代码。
Backbone JS(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, _, $);
});
底线得分JS(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"
}
});
现在我看到 Backbone.js 模块的名称可以是任何名称,但是下划线的名称必须是“underline”,而对于下划线,大小写很重要。
为什么这种差异取决于库的定义方式?
1条答案
按热度按时间kiz8lqtg1#
define
函数可以在有或没有定义的模块名称的情况下调用。此调用没有模块名称。它以一个依赖项数组开始:RequireJS会根据
define
出现的文件的基本名称或者根据您在paths
配置中给予的名称来分配一个模块名称。您可以将paths: { platypus: '... path to file' }
和您的模块命名为platypus
。此调用有一个模块名称:
它将模块命名为
underscore
。(第一个参数不是数组,所以RequireJS将其解释为一个模块名。)而且当名称设置为define
时,它不会改变,所以当你把它作为一个依赖项的时候,它必须被命名为underscore
。(您可以在RequireJS配置中使用map
来重新Map名称,但最终模块名称将固定为underscore
。)如果您尝试使用上面的platypus
示例来处理此模块,RequireJS会产生错误,因为它会找到名为underscore
的模块,但找不到名为platypus
的模块。在
define
调用中指定模块名称,而没有显式和实质性理由这样做是不好的做法。RequireJS文档建议不要这样做:这些[即模块名称]通常由优化工具生成。您可以自己显式地命名模块,但是这会降低模块的可移植性--如果您将文件移动到另一个目录,您将需要更改名称。通常最好避免为模块编写名称,而让优化工具在模块名称中烧入代码。优化工具需要添加名称,以便可以在一个文件中捆绑多个模块,从而允许在浏览器中更快地加载。