CommonJS
CommonJS是一個項目,其目標是為JavaScript在網頁瀏覽器之外建立模塊約定。創建這個項目的主要原因是當時缺乏普遍可接受形式的JavaScript腳本模塊單元,模塊在與運行JavaScript腳本的常規網頁瀏覽器所提供的不同的環境下可以重複使用。
歷史
這個項目由Mozilla工程師Kevin Dangoor於2009年1月發起,最初名為ServerJS[1]。在2009年8月,這個項目被改名為「CommonJS」來展示其API的廣泛的應用性[2]。有關規定在一個開放進程中被建立和認可,一個規定只有在已經被多個實現完成之後才被認為是最終的[3]。 CommonJS不隸屬於致力於ECMAScript的Ecma國際的工作組 TC39,但是TC39的一些成員參與了這個項目[4]。
在2013年5月,Node.js套件管理器(npm)的作者Isaac Z. Schlueter,宣布Node.js已經廢棄了CommonJS,Node.js核心開發者應避免使用它[5]。
規定
規定列表包括[6]:
當前
- Modules/1.0 (被Modules/1.1取代)
- Modules/1.1
- Modules/1.1.1
- Packages/1.0
- 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對象作為唯一的導出方式。[7]
在模塊中,必須有一個自由變量module,它是一個對象。module對象必須有一個id屬性,它是這個模塊的頂層id。id屬性必須是這樣的:require(module.id)會從源出module.id的那個模塊返回exports對象。(就是說module.id可以被傳遞到另一個模塊,而且在要求它時必須返回最初的模塊)。[8]
樣例代碼
- 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[9]
- Common Node[10]
- CommonJS Compiler - 命令行工具使Common JS模塊適用於瀏覽器內使用[11]
- CommonJS for PHP - 針對PHP 5.3+的輕量級CommonJS實現[12]
- CouchDB[13]
- Flusspferd[14]
- GPSEE[15]
- Jetpack
- Joyent 智能平台[16]
- JSBuild[17]
- MongoDB[18]
- Narwhal (JavaScript平台)[19]
- Node.js[20]
- Persevere[21]
- PINF JavaScript裝載器[22]
- RingoJS[23]
- SilkJS[24]
- SproutCore[25]
- TeaJS[26]
- Wakanda[27]
- XULJet[28]
- QUnit
參見
- 服務器端JavaScript實現列表
- 文檔對象模型(DOM),網頁瀏覽器客戶端應用程序接口(API),通常以JavaScript獲得
- JSGI
引用
- ^ What Server Side JavaScript needs - Blue Sky On Mars. [2019-05-17]. (原始內容存檔於2017-12-24).
- ^ CommonJS: JavaScript Standard Library. [2019-05-17]. (原始內容存檔於2010-05-21).
- ^ ProposalProcess - CommonJS Spec Wiki. [2019-05-17]. (原始內容存檔於2017-09-06).
- ^ CommonJS: the First Year - Blue Sky On Mars. [2019-05-17]. (原始內容存檔於2017-09-06).
- ^ Schlueter, Isaac Z. Forget CommonJS. It's dead. **We are server side JavaScript.**. GitHub. 25 Mar 2013 [2019-05-17]. (原始內容存檔於2015-05-08).
- ^ CommonJS Spec Wiki. [2019-05-17]. (原始內容存檔於2019-05-17).
- ^ Modules/1.0 (頁面存檔備份,存於網際網路檔案館).
- ^ Modules/1.1.1 (頁面存檔備份,存於網際網路檔案館).
- ^ Server-side JavaScript development and hosting - Akshell. [2020-09-25]. (原始內容存檔於2018-04-08).
- ^ olegp/common-node @ GitHub. [2019-05-17]. (原始內容存檔於2012-11-21).
- ^ - GitHub. [2019-05-17]. (原始內容存檔於2018-09-30).
- ^ DrBenton/CommonJSForPHP - GitHub. [2019-05-17]. (原始內容存檔於2019-09-24).
- ^ Implementations/CouchDB - CommonJS Spec Wiki. [2019-05-17]. (原始內容存檔於2017-04-26).
- ^ Flusspferd - CommonJS平台 | Javascript的C绑定. [2019-05-17]. (原始內容存檔於2013-01-28).
- ^ Implementations/GPSEE - CommonJS规范Wiki. [2019-05-17]. (原始內容存檔於2017-04-26).
- ^ Implementations/Smart - CommonJS Spec Wiki. [2019-05-17]. (原始內容存檔於2017-04-26).
- ^ Homepage - JSBuild. [2019-05-17]. (原始內容存檔於2011-01-04).
- ^ MongoDB. [2019-05-17]. (原始內容存檔於2014-01-22).
- ^ Implementations/Narwhal - CommonJS Spec Wiki. [2019-05-17]. (原始內容存檔於2017-04-26).
- ^ Implementations/node.js - CommonJS Spec Wiki. [2019-05-17]. (原始內容存檔於2017-08-30).
- ^ Implementations/Persevere - CommonJS Spec Wiki. [2019-05-17]. (原始內容存檔於2017-04-25).
- ^ pinf/loader-js - GitHub. [2019-05-17]. (原始內容存檔於2014-01-07).
- ^ Implementations/RingoJS - CommonJS Spec Wiki. [2019-05-17]. (原始內容存檔於2017-04-25).
- ^ SilkJS WWW Site. [2019-05-17]. (原始內容存檔於2017-09-12).
- ^ Implementations/SproutCore - CommonJS Spec Wiki. [2019-05-17]. (原始內容存檔於2017-04-25).
- ^ Implementations/TeaJS - CommonJS Spec Wiki. [2019-05-17]. (原始內容存檔於2017-04-26).
- ^ Wakanda. [2019-05-17]. (原始內容存檔於2012-06-04).
- ^ xuljet - XUL JavaScript Enhanced Toolkit - Google Project Hosting. [2019-05-17]. (原始內容存檔於2011-02-12).
外部連結
- 官方網站
- CommonJS effort sets JavaScript on path for world domination. Ars Technica. Dec 2009 [2019-05-17]. (原始內容存檔於2011-08-22).