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