requirejs - 在不同的文件中加载具有不同名称的相同模块

时间:2013-03-12 09:05:56

标签: javascript requirejs amd

使用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是否在使用的模块名称和实际加载的模块之间存储了一个映射?

1 个答案:

答案 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寄存器这个单一来源作为不同的模块。