RequireJS中的模块命名

时间:2014-11-04 12:22:58

标签: javascript backbone.js requirejs underscore.js js-amd

我们可以使用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"
    }
});

现在我读到骨干模块的名称可以是任何名称,但下划线的名称必须是“下划线”,对于下划线,大小写很重要。

我无法理解为什么区别于库的定义差异。

请你解释一下。

1 个答案:

答案 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的文档没有这样做:

  

这些[即模块名称]通常由优化工具生成。您可以自己明确命名模块,但它使模块的可移植性降低 - 如果将文件移动到另一个目录,则需要更改名称。通常最好避免使用模块名称进行编码,只需让优化工具在模块名称中进行刻录。优化工具需要添加名称,以便可以在文件中捆绑多个模块,以便在浏览器中加快加载速度。