# CommonJS 規范
CommonJS 是以在瀏覽器環境之外構建 JavaScript 生態系統為目標而產生的項目,比如在服務器和桌面環境中。
這個項目最開始是由 Mozilla 的工程師 Kevin Dangoor 在2009年1月創建的,當時的名字是 ServerJS。
> 我在這里描述的并不是一個技術問題,而是一件重大的事情,讓大家走到一起來做決定,邁出第一步,來建立一個更大更酷的東西。 —— Kevin Dangoor's [What Server Side JavaScript needs](http://www.blueskyonmars.com/2009/01/29/what-server-side-javascript-needs/)
2009年8月,這個項目改名為 CommonJS,以顯示其 API 的更廣泛實用性。CommonJS 是一套規范,它的創建和核準是開放的。這個規范已經有很多版本和具體實現。CommonJS 并不是屬于 ECMAScript TC39 小組的工作,但 TC39 中的一些成員參與 CommonJS 的制定。2013年5月,Node.js 的包管理器 NPM 的作者 Isaac Z. Schlueter 說 [CommonJS 已經過時,Node.js 的內核開發者已經廢棄了該規范](https://github.com/nodejs/node-v0.x-archive/issues/5132#issuecomment-15432598)。
CommonJS 規范是為了解決 JavaScript 的作用域問題而定義的模塊形式,可以使每個模塊它自身的命名空間中執行。該規范的主要內容是,模塊必須通過 `module.exports` 導出對外的變量或接口,通過 `require()` 來導入其他模塊的輸出到當前模塊作用域中。
一個直觀的例子:
```js
// moduleA.js
module.exports = function( value ){
return value * 2;
}
```
```js
// moduleB.js
var multiplyBy2 = require('./moduleA');
var result = multiplyBy2(4);
```
CommonJS 是同步加載模塊,但其實也有瀏覽器端的實現,其原理是現將所有模塊都定義好并通過 `id` 索引,這樣就可以方便的在瀏覽器環境中解析了,可以參考 [require1k](https://github.com/Stuk/require1k) 和 [tiny-browser-require](https://github.com/ruanyf/tiny-browser-require) 的源碼來理解其解析(resolve)的過程。
更多關于 CommonJS 規范的內容請查看 [http://wiki.commonjs.org/wiki/CommonJS](http://wiki.commonjs.org/wiki/CommonJS)。