2014-11-04 91 views
2

我们可以用BackboneJS和UnderscoreJS模块命名在RequireJS

的AMD兼容版本我曾在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" 
    } 
}); 

现在我读了骨干模块名称可以是任何东西,但下划线的名称必须是“强调”和下划线,资本是非常重要的。

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

你能否给我解释一下。

回答

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配置重新映射的名字,但最终的模块名称固定为underscoremap)如果你试过platypus例如上面这个模块,RequireJS会产生一个错误,因为它会找到一个名为underscore,但没有模块名为platypus

指定在define调用的模块名称没有明确大幅原因这样做是不好的做法。 RequireJS recommends的文档不是这样做的:

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

+1

所以,如果我理解正确,顺序/顺序是这样的...如果模块名称没有通过define()(定义骨干)在模块内定义...那么它被命名为每个定义在路径中(在执行requirejs.config()时) – testndtv 2014-11-05 07:37:28

+0

是的,这就是它的工作原理。 – Louis 2014-11-05 11:20:27