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

时间:2013-11-01 04:10:04

标签: javascript requirejs

我们可以在requireJS中创建一个名称:

define("name",[dep],function(dep) {
      // module definition
});

或者我们可以创建一个不包括名称:

define([dep],function(dep) {
      // module definition
});

创建模块的更好方法是什么?我知道RequireJS建议避免分配模块名称。

但我想知道我们在什么场景下做,而不必给模块命名。这会影响使用吗?每种方式的优点和缺点是什么?

2 个答案:

答案 0 :(得分:19)

这就是requirejs documentation在命名模块主题上所说的内容:

  

这些通常由优化工具生成。您可以自己明确命名模块,但它使模块的可移植性降低 - 如果将文件移动到另一个目录,则需要更改名称。通常最好避免使用模块名称进行编码,只需让优化工具在模块名称中进行刻录。优化工具需要添加名称,以便可以在文件中捆绑多个模块,以便在浏览器中加快加载速度。

但是,假设您想要您的模块有一个众所周知的名称,它允许始终以任何其他模块的相同方式要求它。那么您是否需要使用名称的define来电?一点也不。您可以在配置中使用paths

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 Bootstrap作为"bootstrap"等。最佳做法是将define的名称留给{{3} }。

答案 1 :(得分:11)

在我的脑海中,我见过的唯一使用命名模块方法的模块是jQuery。就个人而言,我还建议使用未命名的模块模式。

命名模块

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

未命名的模块

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