使用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是否在使用的模块名称和实际加载的模块之间存储了一个映射?
答案 0 :(得分:4)
正如你自己所说:
显然,最佳做法是在任何地方使用模块名称
RequireJS强制执行这种做法,直至某一点。问题在于,当您在paths
'myMod':'src/js/myModule'
中告诉RequireJS时,您实际上是在说src/js/myModule
名称为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寄存器这个单一来源作为不同的模块。