简介§ 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 部分

优化工具§ 7

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