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