2

使用 requirejs,我有两个文件依赖于同一个模块。我必须确保在两个依赖项中始终使用相同的模块名称吗?例如,如果我为 require.config 定义了一个路径:

'myMod':'src/js/myModule'

然后一次使用名称,一次使用实际路径,如下所示:

//in a.js
define(function(require){
 var mod = require('myMod');
});

//in b.js
define(function(require){
 var mod = require('src/js/myModule');
});

显然,最佳实践是在任何地方都使用模块名称,但我想知道为什么这会导致实际错误。

requirejs 是否在使用的模块名称和实际加载的模块之间存储映射?

4

1 回答 1

4

正如你自己所说:

显然,最好的做法是在任何地方都使用模块名称

RequireJS 在一定程度上强制执行这种做法。问题是当你在你的文件中告诉 RequireJS 时paths'myMod':'src/js/myModule'你实际上是在说你想src/js/myModule在 name 下加载myMod。如果您随后通过完整路径引用它,那么这很可能是您的错误。如果这发生在我的代码中,我会认为这是一个错误。所以我希望 RequireJS 在发生这种情况时失败。

还有语义问题。基本情况是,如果传递给require不同的两个名称,一旦解析了相对路径,那么它们将引用两个不同的模块。如果你这样做require('myMod')并且require('src/js/myModule')你期待两个不同的模块,那么就这样吧。如果你这样做require('myMod')require('myMod')你会得到相同的模块。所以有了paths你设置的,你真正想要什么?相同的模块还是不同的模块?

RequireJS 有办法给你两个。如果您希望两个模块名称都为您提供相同的模块,则删除paths配置并改用map配置:

map: {
  '*': {
    myMod: 'src/js/myModule'
  }
}

这意味着“在所有模块(*)中,如果对模块发出请求,则改为myMod加载模块”。src/js/myModule意图一清二楚。

如果您希望两个路径都为您提供不同的模块,尽管它们共享相同的源,您可以使用 RequireJS 插件来为您的模块加载相同的源,但让 RequireJS 将此单个源注册为不同的模块。

于 2015-01-03T13:52:03.500 回答