介绍§ 1

CommonJS定义了一种模块格式。不幸的是,它在定义时并未赋予浏览器与其他JavaScript环境同等的地位。因此,存在有关传输格式和异步require的 CommonJS规范建议。

RequireJS尝试保持CommonJS的精神,使用字符串名称来引用依赖项,并避免模块定义全局对象,但仍然允许编码在浏览器中本机运行良好的模块格式。RequireJS实现异步模块定义(以前称为Transport/C)建议。

如果您具有传统CommonJS模块格式的模块,则可以轻松地将它们转换为与RequireJS一起使用。并非所有模块都会干净地转换为新格式。可能无法很好转换的模块类型:

  • 使用条件代码执行require调用的模块,例如if(someCondition)require('a1')else require('a2');
  • 某些类型的循环依赖项。

手动转换§ 2

如果您只有几个要转换的模块,则只需将模块包装在以下代码中:

define(function(require, exports, module) {
    //将传统的CommonJS模块内容放在此处
});

重要提示: 函数参数应始终按require, exports, module,顺序列出,并具有确切的名称和正确的顺序,否则会造成混乱。您可以从列表中省略导出和模块,但是如果需要它们,则需要按照此处说明的确切顺序进行指定。

转换工具§ 3

如果您有许多要转换的模块,则r.js项目在r.js文件中内置了一个转换工具。为其提供要转换的目录的路径和输出目录:

node r.js -convert path/to/commonjs/modules/ path/to/output

少数CommonJS模块不能像define()包裹的模块那样很好地工作。

设置出口值§ 4

有一些CommonJS系统(主要是Node)允许通过将导出的值分配为module.exports来设置导出的值。RequireJS支持该惯用语,但是还有另一种更简单的方法-只需从传递给define的函数中返回值即可:

define(function (require) {
    var foo = require('foo');
    //将此模块定义为导出函数
    return function () {
        foo.doSomething();
    };
});

使用这种方法,通常不需要exports和模块函数参数,因此可以将它们保留在模块定义之外。

替代语法§ 5

除了使用require()获取传递给define()的函数内部的依赖关系之外,您还可以通过define()的依赖关系数组参数来指定它们。依赖关系数组中名称的顺序与传递给传递给define()的定义函数的参数顺序相匹配。因此,上面的示例使用模块foo:

define(['foo'], function (foo) {
    return function () {
        foo.doSomething();
    };
});

有关该语法的更多信息,请参见API文档

从CommonJS包中加载模块§ 6

可以通过设置RequireJS配置以了解位置和包属性来由RequireJS加载CommonJS包中的模块。有关更多信息,请参见包API部分

优化工具§ 7

RequireJS有一个优化工具,可以将模块定义组合到优化的包中,以供浏览器交付。它用作命令行工具,您可以在代码部署中使用它。有关更多信息,请参见 优化文档