本規範致力於描述一類能夠同時適用於客戶端和服務器端的模塊系統。該系統中的模塊擁有本身的做用域,能夠從其餘模塊導入單例對象,或者對外提供 API。數據庫
Require
require 是一個函數對象。數組
- require 函數接受一個稱爲模塊標識符的參數。
- require 函數返回外部模塊提供的 API。
- 當發生循環依賴時,一個外部模塊被其依賴模塊導入時,它可能未被徹底執行。在此種狀況下,當前模塊調用 require 函數所返回的對象必須包含該外部模塊已經準備好的輸出物。
- 若是不能返回所請求的模塊,則 require 函數應該拋出異常。
- require 函數能夠有一個 main 屬性。
- 當屬性 main 存在,它應該是隻讀的且不能刪除。
- main 屬性應該是 undefined,或是已加載模塊的 module 對象。
- require 函數能夠有一個 paths 屬性,該屬性是一個具備優先秩序的路徑數組,優先級從高到低,路徑一直回溯到頂級模塊目錄。
- paths 屬性不該存在於沙盒中。
- 全部模塊中的 paths 屬性應該一致。
- 使用另外一個對象替換 paths 對象是無效的。
- 若是 paths 屬性存在,修改 paths 內容會對模塊搜索行爲產生影響。
- 若是 paths 屬性存在,它所包含的路徑可能不是所有的搜索路徑。由於加載器能夠能會在搜索 paths 提供的路徑以前或以後去檢查其它的路徑。
- 若是 paths 屬性存在,加載器責任去解析、標準化、規範化路徑。
模塊上下文
- 一個模塊中只有一個自由變量 require,該變量符合以上對 require 函數的定義。
- 一個模塊中只有一個自由變量 exports,當模塊被執行時,該模塊對外提供的 API 被添加到該 exports 對象上。
- 模塊必須使用 exports 對象做爲惟一的輸出手段。
- 一個模塊中應該包含一個自由變量 module,該變量是一個 Object 對象。
- module 對象應該擁有一個 id 屬性,它是模塊的頂級屬性。當執行 require(module.id) 時,返回 module.id 所屬模塊的輸出對象。若是該屬性被實現,則它應該是一個只讀屬性,不能刪除。
- module 對象能夠有一個 uri 屬性,該屬性指向模塊源文件。uri 屬性不該存在於沙盒中。
模塊標識符
- 模塊標識符是一個由多個詞彙組成的字符串,不一樣詞彙之間使用正斜槓分隔。
- 單個詞彙應該是駝峯標識符,
.
或 ..
。
- 模塊標識符不能包含文件後綴名,例如
.js
。
- 模塊標識符能夠是相對的,也能夠是頂級的。若是標識符首個單詞是
.
或 ..
,那麼該標識符就是相對的。
- 頂級標識符是相對於所謂根命名空間而言。
- 相對標識符是相對於 require 函數所處的模塊而言。
未說明
本規範有如下重要點未說明:服務器
- 模塊是否存儲於數據庫、文件系統或工廠函數中,又或者能夠和連接庫進行互換。
- 模塊加載器是否支持使用 PATH 環境變量來解析模塊標識符。
PS:本規範從 CommonJS 官方英文版本轉譯而來,斜體部分表示譯文存在商榷。函數
Ref:
CommonJS Module 1.1.1ui