CommonJS

CommonJS是一个项目，其目标是为JavaScript在网页浏览器之外建立模块约定。创建这个项目的主要原因是当时缺乏普遍可接受形式的JavaScript脚本模块单元，模块在与运行JavaScript脚本的常规网页浏览器所提供的不同的环境下可以重复使用。

历史 
这个项目由Mozilla工程师Kevin Dangoor于2009年1月发起，最初名为ServerJS。在2009年8月，这个项目被改名为“CommonJS”来展示其API的广泛的应用性。有关规定在一个开放进程中被建立和认可，一个规定只有在已经被多个实现完成之后才被认为是最终的。 CommonJS不隶属于致力于ECMAScript的Ecma国际的工作组 TC39，但是TC39的一些成员参与了这个项目。

在2013年5月，Node.js包管理器npm的作者Isaac Z. Schlueter，宣布Node.js已经废弃了CommonJS，Node.js核心开发者应避免使用它。

规定 
规定列表包括：

当前 

 Modules/1.0 (被Modules/1.1取代)
 Modules/1.1
 Modules/1.1.1
 Packages/1.0
 Promises/B
 Promises/C
 System/1.0

提议 

 Binary/B
 Binary/F
 Console
 Encodings/A
 Filesystem/A
 Filesystem/A/0
 Modules/Async/A
 Modules/Transport/B
 Packages/1.1
 Packages/Mappings
 Unit Testing/1.0

模块
require是一个函数，require函数接受一个模块标识符，require返回外部模块的导出的API。如果要求的模块不能被返回则require必须throw一个错误。在模块内，有一个自由变量require，它满足上述定义。在模块内，有一个自由变量叫做exports，它是一个对象，模块在执行时可以向其增加模块的API。模块必须使用exports对象作为唯一的导出方式。

在模块中，必须有一个自由变量module，它是一个对象。module对象必须有一个id属性，它是这个模块的顶层id。id属性必须是这样的：require(module.id)会从源出module.id的那个模块返回exports对象。（就是说module.id可以被传递到另一个模块，而且在要求它时必须返回最初的模块）。

样例代码 
math.js
exports.add = function() {
    var sum = 0, i = 0, args = arguments, l = args.length;
    while (i < l) {
        sum += args[i++];
    }
    return sum;
};

increment.js
var add = require('math').add;
exports.increment = function(val) {
    return add(val, 1);
};

program.js
var inc = require('increment').increment;
var a = 1;
inc(a); // 2

module.id == "program";

实现 

 Akshell
 Common Node
 CommonJS Compiler - 命令行工具使Common JS模块适用于浏览器内使用
 CommonJS for PHP - 针对PHP 5.3+的轻量级CommonJS实现
 CouchDB
 Flusspferd
 GPSEE
 Jetpack
 Joyent 智能平台
 JSBuild
 MongoDB
 Narwhal (JavaScript平台)
 Node.js
 Persevere
 PINF JavaScript装载器
 RingoJS
 SilkJS
 
 TeaJS

参见 
 
 文档对象模型（DOM），网页浏览器客户端应用程序接口（API），通常以JavaScript获得

引用

外部链接 
 
 

JavaScript