CommonJS規范
CommonJS分為1.0和1.1兩個版本。
CommmonJS 1.0
-
模塊上下文
- 在一個模塊中,存在一個自由變量“require”函數
- 這個“rquire”函數接收一個模塊標識符。
- “rquire”返回外部模塊所輸出的API。
- 如果出現依賴閉環(dependency cycle),那么外部模塊在被它的傳遞依賴(transitive dependencies)所require的時候可能并沒有執行完成,這種情況下“require“返回的對象必須至少包含此外部模塊在調用require函數之前就已經準備完畢的輸出。
- 如果請求模塊不能返回,那么”require“必須拋出一個錯誤。
- 在一個模塊中,存在一個名為”exports“的自由變量,它是一個對象,模塊可以在執行的時候把自身API加入到其中。
- 模塊必須使用”exports“對象來作為輸出的唯一表示。
- 在一個模塊中,存在一個自由變量“require”函數
-
模塊標示符
- 模塊標示符是一個由正斜杠分隔的”terms“組成的字符串。
- 一個term的必須為駝峰樣式標識符,或者為”.“或”..“。
- 模塊標識符可以省略文件名的后綴。比如”.js“
- 模塊標識符可以是相對路徑(relative)或者絕對路徑(top-level)。如果模塊標識符的開頭是”.“或者”..“則此模塊標識符為相對路徑。
- 絕對路徑必須是模塊所在命名空間的根。
- 相對路徑必須是相對于當前require的模塊。
-
未規范
此規范對于如下關于協同工作能力方面的重要內容未進行規范:- 模塊是否可以通過數據庫、文件系統或者工廠函數進行存儲或者可以通過鏈接庫進行內部交換。
- 模塊加載器是否應該支持PATH變量用來解析模塊標識符。
-
單元測試
- Unit Tests at Google Code by Kris Kowal
- Unit Test Git Mirror by Ash Berlin
-
示例代碼
-
math.js
exports.add = function(){ var sum = 0 , i = 0 , args = arguments , 1 = args.length; while(i < 1){ 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
-
CommonJS 1.1
CommonJS 1.1與 1.0相比主要在 模塊上下文(Module Context)部分增加了一些規范。
- 模塊上下文
- 在一個模塊中,存在一個自由變量“require”函數
- 這個“rquire”函數接收一個模塊標識符。
- “rquire”返回外部模塊所輸出的API。
- 如果出現依賴閉環(dependency cycle),那么外部模塊在被它的傳遞依賴(transitive dependencies)所require的時候可能并沒有執行完成,這種情況下“require“返回的對象必須至少包含此外部模塊在調用require函數之前就已經準備完畢的輸出。
- 如果請求模塊不能返回,那么”require“必須拋出一個錯誤。
- require有一個只讀的、不可刪除的”main“屬性?!?strong>main“相當于程序根目錄的module。如果設置了該屬性,則其必須和根目錄的module指向相同的對象。
-
require有個paths屬性,該屬性是一個具有優先秩序的路徑數組,優先級從高到低,路徑一直回朔到地根模塊目錄。
- paths屬性不會存在于沙盒中。
- 在所有模塊中paths的attribute均指向相同的值。
- paths是無法被替換的。
- 當paths的attribute存在時,修改paths的內容可能會導致模塊無法被正確的搜索到。
- 當paths的attribute存在時,它可能只包含了部分path,當模塊加載器在使用這些路徑之前或者之后,去檢查其它的路徑。
- 當paths的attribute存在時,它是模塊加載器使paths規范化、標準化的依據。
- 在一個模塊中,存在一個名為”exports“的自由變量,它是一個對象,模塊可以在執行的時候把自身API加入到其中。
- 模塊必須將exports作為導出對象的唯一工具。
- 模塊必須使用”exports“對象來作為輸出的唯一表示。
- module對象有一個制度的、不可刪除的id屬性。當執行require(module.id)時,可以通過該id找到對應的module并返回module exports出的對象。
- 當創建一個module對象時,該對象可以有一個URI屬性。該屬性指向對應的模塊源文件。該URI不存在于沙盒中。
- 在一個模塊中,存在一個自由變量“require”函數
附:
原文鏈接:
Modules/1.0
Modules/1.1