RequireJS:模块 ID 与模块名称

RequireJS: module ID vs module name

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

摘录:

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

RequireJS also assumes by default that all dependencies are scripts, so it does not expect to see a trailing ".js" suffix on module IDs. RequireJS will automatically add it when translating the module ID to a path.

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

The path that is used for a module name should not include an extension, since the path mapping could be for a directory. The path mapping code will automatically add the .js extension when mapping the module name to a path.

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

The loader stores modules by their name and not by their path internally. So for relative name references, those are resolved relative to the module name making the reference, then that module name, or ID, is converted to a path if needs to be loaded.

模块名和模块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 配置,因此会构建路径 /lib/a/b/c,然后将 baz 添加到它和扩展名,以便它会尝试加载文件 /lib/a/b/c/baz.js。因此,如果您有相关模块的层次结构,您可以只将该层次结构的根放在 paths 中,而不是为层次结构中的每个模块指定路径。

第三个引用指出模块 ID 是在解释相对模块 ID 时使用的。假设 flip/flop 已经加载并且它的依赖项中有 ..。 RequireJS 会将 flip/flop.. 组合起来解析为 flip,然后 RequireJS 会将此模块 ID 转换为路径:d/e/f.js 因为 flippaths。有时人们认为 RequireJS 会解释 .. 相对于需要它的模块的 path。引用澄清事实并非如此。 (如果是这样,那么 RequireJS 会尝试加载 dir/dir.js。)