37

我们可以通过给它一个名字来在 requireJS 中创建一个模块:

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

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

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

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

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

4

2 回答 2

19

这是 requirejs文档关于命名模块主题的内容:

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

但是,假设您希望您的模块具有一个众所周知的名称,该名称始终允许以相同的方式从任何其他模块中要求它。然后,您是否需要使用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带有名称的调用留给优化器

于 2013-11-01T10:41:09.447 回答
11

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

命名模块

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

未命名的模块

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

于 2013-11-01T04:38:50.643 回答