CommonJS 是以在浏览器环境之外构建 JavaScript 生态系统为目标而产生的项目,比如在服务器和桌面环境中。
这个项目最开始是由 Mozilla 的工程师 Kevin Dangoor 在2009年1月创建的,当时的名字是 ServerJS。

我在这里描述的并不是一个技术问题,而是一件重大的事情,让大家走到一起来做决定,迈出第一步,来建立一个更大更酷的东西。 —— Kevin Dangoor’s What Server Side JavaScript needs

CommonJS 规范是为了解决 JavaScript 的作用域问题而定义的模块形式,可以使每个模块它自身的命名空间中执行。该规范的主要内容是,模块必须通过 module.exports 导出对外的变量或接口,通过 require() 来导入其他模块的输出到当前模块作用域中。

Commonjs 提供两个工具:

  1. require() 函数,当前作用域下导入其他模块.
  2. module 对象, 当前域到处变量和接口.

无格式的js例子

这是一个没有commonjs的例子:

salute.js文件里面定义一个别的地方要用到的变量MySalute。

  1. // salute.js
  2. var MySalute = "Hello";

world.js文件里面使用salute.js里面定义的变量

  1. // world.js
  2. var Result = MySalute + " world!";

Module 定义

可以看到world.js 里面的MySalute is not defined。
所以,我们需要给每个文件定义一个module:

  1. // salute.js
  2. var MySalute = "Hello";
  3. module.exports = MySalute;
  1. // world.js
  2. var Result = MySalute + "world!";
  3. module.exports = Result;

我们用了一个特殊变量module,并将定义的变量引用放到module.exports 以至于CommonJS模块系统知道我们模块的对象。
salute.js 暴露了 MySalute, world.js 暴露了 Result.

Module 依赖

我们还差一步就完成了:依赖定义。
我们给每个文件定义一个独立的模块,但是world.js得知道是谁定义的Mysalute
We’ve already defined every script as an independent module, but world.js

  1. // salute.js
  2. var MySalute = "Hello";
  3. module.exports = MySalute;
  1. // world.js
  2. var MySalute = require("./salute");
  3. var Result = MySalute + "world!";
  4. module.exports = Result;

注一道我们没有用完整的文件名salute.js 而是./salute./ 表示和world module在同一个目录.

例子

函数

  1. // moduleA.js
  2. module.exports = function( value ){
  3. return value*2;
  4. }
  1. // moduleB.js
  2. var multiplyBy2 = require('./moduleA');
  3. var result = multiplyBy2( 4 );