Javascript RequireJS中的命名模块与未命名模块

Javascript RequireJS中的命名模块与未命名模块,javascript,requirejs,Javascript,Requirejs,我们可以在requireJS中创建一个模块,命名为: define("name",[dep],function(dep) { // module definition }); 或者我们可以创建一个不包括名称的: define([dep],function(dep) { // module definition }); 创建模块的更好方法是什么?我知道RequireJS建议避免分配模块名 但我想知道在什么情况下,我们可以不必给模块命名。这会影响使用吗?每种方法的优点和缺

我们可以在requireJS中创建一个模块,命名为:

define("name",[dep],function(dep) {
      // module definition
});
或者我们可以创建一个不包括名称的:

define([dep],function(dep) {
      // module definition
});
创建模块的更好方法是什么?我知道RequireJS建议避免分配模块名


但我想知道在什么情况下,我们可以不必给模块命名。这会影响使用吗?每种方法的优点和缺点是什么?

不经意间,我看到的唯一使用命名模块方法的模块是jQuery。就个人而言,我还建议使用未命名的模块模式

命名模块 通过命名模块,用于请求的名称独立于其位置。另一个模块作者可能会盲目地要求使用“jquery”,而不知道模块路径。如果您正在开发一个可重用的模块(在项目之外),这非常有用。但是,它有一个缺点(以jQuery为例),您需要在RequireJS的
path
config属性中添加和输入,以指向文件的正确位置。否则,RequireJS无法找到要加载的文件,除非它被放置在您的基本require目录中

未命名模块
我发现这些更可取,因为您可以利用相对路径。假设您有两个文件
modules/ClassA
modules/ClassB
ClassB
可以使用
'./ClassA'
要求
ClassA
,如果需要,可以移动整个目录。通过使用未命名的模块,您还可以消除命名冲突的可能性,除非您设法找到一种方法将两个文件放置在同一目录中,并使用相同的名称。

这是requirejs在命名模块主题上所说的:

这些通常由优化工具生成。您可以自己显式命名模块,但这会降低模块的可移植性——如果将文件移动到另一个目录,则需要更改名称。通常,最好避免在模块名称中进行编码,而只是让优化工具在模块名称中燃烧。优化工具需要添加名称,以便可以将多个模块捆绑到一个文件中,以便更快地在浏览器中加载

但是,假设您希望您的模块具有一个已知的名称,该名称允许以与任何其他模块相同的方式始终需要该名称。然后您是否需要使用带有名称的
define
调用?一点也不。您可以在配置中使用:

paths: {
   'jquery': 'external/jquery-1.9.1',
   'bootstrap': 'external/bootstrap/js/bootstrap.min',
   'log4javascript': 'external/log4javascript',
   'jquery.bootstrap-growl': 'external/jquery.bootstrap-growl',
   'font-awesome': 'external/font-awesome'
},
通过这种配置,jQuery可以被要求作为
“jQuery”
,Twitter引导作为
“引导”
,等等。最佳做法是将调用
定义
的名称保留到。加载模块后,我们可以访问模块的“老化”名称吗?@AlexMills这涵盖了您的问题。基本上,如果您的依赖项中有特殊的
模块
模块(例如
定义(['module'],函数(module){…
),那么您可以通过
module.id
)获取模块名称。无论模块如何获取其名称,此操作都有效。