backbone.js RequireJS中的模块命名

q5lcpyga  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(164)

我们可以使用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”,而对于下划线,大小写很重要。
为什么这种差异取决于库的定义方式?

kiz8lqtg

kiz8lqtg1#

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来重新Map名称,但最终模块名称将固定为underscore。)如果您尝试使用上面的platypus示例来处理此模块,RequireJS会产生错误,因为它会找到名为underscore的模块,但找不到名为platypus的模块。
define调用中指定模块名称,而没有显式实质性理由这样做是不好的做法。RequireJS文档建议不要这样做:
这些[即模块名称]通常由优化工具生成。您可以自己显式地命名模块,但是这会降低模块的可移植性--如果您将文件移动到另一个目录,您将需要更改名称。通常最好避免为模块编写名称,而让优化工具在模块名称中烧入代码。优化工具需要添加名称,以便可以在一个文件中捆绑多个模块,从而允许在浏览器中更快地加载。

相关问题