Skip to main content

CommonJS

CommonJS 规范概述了同步声明依赖的模块定义。这个规范主要用于在服务器端实现模块化代码组 织,但也可用于定义在浏览器中使用的模块依赖。CommonJS 模块语法不能在浏览器中直接运行。

CommonJS 模块定义需要使用 require()指定依赖,而使用 exports 对象定义自己的公共 API。 下面的代码展示了简单的模块定义:

var moduleB = require('./moduleB');
module.exports = {
stuff: moduleB.doStuff();
};

请求模块会加载相应模块,而把模块赋值给变量也非常常见,但赋值给变量不是必需的。调用 require()意味着模块会原封不动地加载进来:

console.log("moduleA");
require("./moduleA"); // "moduleA"

无论一个模块在 require()中被引用多少次,模块永远是单例。在下面的例子中,moduleA 只会 被打印一次。这是因为无论请求多少次,moduleA 只会被加载一次。

console.log("moduleA");
var a1 = require("./moduleA");
var a2 = require("./moduleA");
console.log(a1 === a2); // true

模块第一次加载后会被缓存,后续加载会取得缓存的模块(如下代码所示)。模块加载顺序由依赖 图决定。

console.log("moduleA");
require("./moduleA");
require("./moduleB"); // "moduleA"
require("./moduleA");

在 CommonJS 中,模块加载是模块系统执行的同步操作。因此 require()可以像下面这样以编程 方式嵌入在模块中:

console.log("moduleA");

if (loadCondition) {
require("./moduleA");
}

这里,moduleA 只会在 loadCondition 求值为 true 时才会加载。这个加载是同步的,因此 if() 块之前的任何代码都会在加载 moduleA 之前执行,而 if()块之后的任何代码都会在加载 moduleA 之 后执行。同样,加载顺序规则也会适用。因此,如果 moduleA 已经在前面某个地方加载过了,这个条 件 require()就意味着只暴露 moduleA 这个命名空间而已。