RequireJS - 在define()中指定模块ID时

时间:2015-02-11 18:10:05

标签: requirejs amd requirejs-define

在RequireJS文档(http://requirejs.org/docs/api.html#modulename)中,我无法理解这句话。

  

您可以自己明确命名模块,但它会使模块的可移植性降低

我的问题是

  1. 为什么明确命名模块会降低可移植性?
  2. 何时需要明确命名模块?

2 个答案:

答案 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连接工具时才需要(可能还有一些其他边缘情况也很有用)。