简介§ 1
CommonJS 定义了 一种模块格式。不幸的是,它在定义时没有给予浏览器与其他 JavaScript 环境同等的地位。因此,CommonJS 规范提出了 传输格式 和 异步 require 的建议。
RequireJS 试图保持 CommonJS 的精神,使用字符串名称来引用依赖项,并避免模块定义全局对象,但仍然允许编写一种在浏览器中良好运行的模块格式。RequireJS 实现了 异步模块定义(以前称为 Transport/C)建议。
如果您有采用传统 CommonJS 模块格式的模块,则可以轻松地将它们转换为与 RequireJS 一起使用。并非所有模块都能干净地转换为新格式。可能无法很好转换的模块类型:
- 使用条件代码进行 require 调用的模块,例如 if(someCondition) require('a1') else require('a2');
- 某些类型的循环依赖关系。
手动转换§ 2
如果您只需要转换几个模块,那么您只需要将模块包装在此代码中:
define(function(require, exports, module) {
//Put traditional CommonJS module content here
});
重要提示:函数参数应始终列为 require、exports、module,并使用这些确切的名称和确切的顺序,否则会导致混乱。您可以从列表中省略 exports 和 module,但如果需要它们,则需要按照此处所示的确切顺序指定它们。
转换工具§ 3
如果您要转换许多模块,则 r.js 项目 在 r.js 文件中内置了一个转换器工具。为其提供要转换的目录的路径和输出目录:
node r.js -convert path/to/commonjs/modules/ path/to/output
少数 CommonJS 模块不能很好地用作 define() 包装的模块。有关更多信息,请参阅 r.js 自述文件
。设置导出值§ 4
有些 CommonJS 系统(主要是 Node)允许通过将导出值分配为 module.exports 来设置导出值。RequireJS 支持该习惯用法,但还有另一种更简单的方法 - 只需从传递给 define 的函数返回该值即可
define(function (require) {
var foo = require('foo');
//Define this module as exporting a function
return function () {
foo.doSomething();
};
});
使用这种方法,您通常不需要 exports 和 module 函数参数,因此您可以将它们从模块定义中省略。
备用语法§ 5
除了使用 require() 在传递给 define() 的函数内部获取依赖项之外,您还可以通过 define() 的依赖项数组参数指定它们。依赖项数组中名称的顺序与传递给 define() 的定义函数传递的参数的顺序相匹配。所以上面使用模块 foo 的例子
define(['foo'], function (foo) {
return function () {
foo.doSomething();
};
});
有关该语法的更多信息,请参阅 API 文档。
从 CommonJS 包加载模块§ 6
可以通过设置 RequireJS 配置来了解位置和包属性,从而通过 RequireJS 加载 CommonJS 包中的模块。有关更多信息,请参阅 包 API 部分。