在RequireJS文档(http://requirejs.org/docs/api.html#modulename)中,我无法理解这句话。
您可以自己明确命名模块,但它会使模块的可移植性降低
我的问题是
答案 0 :(得分:4)
为什么明确命名模块会降低可移植性?
如果您没有明确地给模块命名,RequireJS可以随意命名,无论您想要什么样的方式,都可以让您更自由地了解您可以用来引用该模块的名称。假设你有一个模块文件bar.js
。你可以给RequireJS这条路径:
paths: {
"foo": "bar"
}
您可以在名称"foo"
下加载模块。如果您在define
调用中为模块命名,那么您将被迫使用该名称。这个问题的一个很好的例子是jQuery。碰巧jQuery开发人员已决定(无缘无故地辨别出来)在jQuery代码中对模块名"jquery"
进行硬编码。偶尔会有人抱怨说他们的代码无效,他们的paths
就是这样:
paths: {
jQuery: "path/to/jquery"
}
由于硬编码名称,这不起作用。 paths
配置必须使用名称"jquery"
,全部为小写。 (map
配置可用于将"jquery"
映射到"jQuery"
。)
何时需要明确命名模块?
当没有其他方法来命名模块时,需要它。当一个文件将多个模块连接在一起时,一个很好的例子是r.js
。如果在连接期间未命名模块,则无法引用它们。所以r.js
为它连接的所有模块添加显式名称(除非你告诉它不要这样做或除非已经命名了模块)。
有时我使用显式命名来称为“胶水”或“实用程序”模块。例如,假设jQuery已经在RequireJS之前通过script
元素加载,但我也希望我的RequireJS模块能够要求模块jquery
访问jQuery而不是依赖全局{{1 }}。如果我想在没有全局jQuery的上下文中运行我的代码,那么我不必为这种情况修改它。我可能有这样的主文件:
$
define('jquery', function () {
return $;
});
require.config({ ... });
模块只用于满足需要jQuery的模块。将它放入一个单独的文件中没有任何好处,并且要正确引用它,必须明确命名。
答案 1 :(得分:1)
这就是为什么命名模块不那么便携,来自Sitepen" AMD,The Definite Source":
AMD也是“匿名”,这意味着该模块不必硬编码任何对其自己路径的引用,模块名称仅依赖于其文件名和目录路径,从而大大简化了任何重构工作。
http://www.sitepen.com/blog/2012/06/25/amd-the-definitive-source/
来自Addy Osmani"编写模块化javascript":
使用匿名模块时,模块标识的概念是DRY,这使得避免重复文件名和代码变得微不足道。由于代码更具可移植性,因此可以轻松地将其移动到其他位置(或文件系统周围),而无需更改代码本身或更改其ID。 module_id等同于简单包中的文件夹路径以及未在包中使用时。开发人员也可以通过使用适用于CommonJS环境(如r.js)的AMD优化器在多个环境中运行相同的代码。
http://addyosmani.com/writing-modular-js/
为什么人们需要一个明确命名的模块,再次来自Addy Osmani"编写模块化的javascript":
module_id是一个可选参数,通常仅在使用非AMD连接工具时才需要(可能还有一些其他边缘情况也很有用)。