RequireJS中的模块命名

问题描述 投票:2回答:1

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

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

为什么基于库的定义有何不同?

javascript backbone.js requirejs underscore.js js-amd
1个回答
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的文档没有这样做:

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

© www.soinside.com 2019 - 2024. All rights reserved.