RequireJS - 模块ID与模块名称

时间:2015-06-26 01:35:25

标签: javascript requirejs amd js-amd

我在RequireJS中有点像菜鸟;我最近阅读了API documentation,并遇到了这两个术语:module IDmodule name。它们可以互换使用吗?或者他们是不同的概念?

摘录:

http://requirejs.org/docs/api.html#jsfiles

  

默认情况下,RequireJS还假定所有依赖项都是脚本,因此它不希望看到尾随的" .js" 模块ID 的后缀。在将模块ID 转换为路径时,RequireJS会自动添加它。

http://requirejs.org/docs/api.html#config-paths

  

用于模块名称的路径不应包含扩展名,因为路径映射可能适用于目录。将模块名称映射到路径时,路径映射代码将自动添加.js扩展名。

http://requirejs.org/docs/api.html#modulenotes

  

加载程序按名称存储模块,而不是内部存储模块。因此,对于相对名称引用,这些相对于作为引用的模块名称进行解析,然后模块名称 ID ,如果需要加载则转换为路径

1 个答案:

答案 0 :(得分:5)

模块名称和模块ID是相同的,它们与模块路径不同。假设以下配置:

require.config({
    baseUrl: '/lib/',
    paths  : {
        bar        : 'a/b/c',
        flip       : 'd/e/f',
        'flip/flop': 'dir/dir/something'
    }
});

您的第一句话说明了当您拨打require(['foo'], ...之类的内容时会发生什么。上面的配置中没有paths指定foo转换为的内容。因此RequireJS将从模块id创建一个路径,即foo。最终它会尝试加载文件/lib/foo.js

你的第二句话说明当你的模块 paths时会发生什么。如果您require(['bar'], ...,则在尝试加载时,RequireJS会将ID转换为/lib/a/b/c.js。它增加了扩展本身。同样的引用也倾向于暗示你做require(['bar/baz'], ...的情况。使用上面的配置,RequireJS会将模块ID分成两部分:barbaz,会发现bar具有paths配置,因此会构建路径{ {1}}然后会向其添加/lib/a/b/c和扩展程序,以便尝试加载文件baz。因此,如果您具有相关模块的层次结构,则可以将该层次结构的根目录放在/lib/a/b/c/baz.js中,而不是为层次结构中的每个模块指定路径。

第三个引用指出模块id是解释相关模块id时使用的。我们假设paths已加载,其依赖项中包含flip/flop。 RequireJS会将..flip/flop合并为..,然后RequireJS会将此模块ID转换为路径:flip,因为d/e/f.js具有映射flip。有时人们认为RequireJS会相对于需要它的模块的路径解释paths。该报价澄清事实并非如此。 (如果是这种情况,那么RequireJS会尝试加载..。)