简介§ 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 README
更多信息。设置导出值§ 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
除了在 define() 传递的函数内部使用 require() 获取依赖项之外,还可以通过 define() 的依赖数组参数来指定它们。依赖数组中的名称顺序与传递给 define() 的定义函数的参数顺序相对应。所以对于上面使用名为foo:
define(['foo'], function (foo) {
return function () {
foo.doSomething();
};
});
有关 writeFile 示例,请参见API 文档的模块示例,请参阅有关该语法的更多信息。
从 CommonJS 包中加载模块§ 6
通过配置 RequireJS 以了解位置和包属性,RequireJS 可以加载 CommonJS 包中的模块。详见包 API 部分了解更多详情。