CommonJS規范

CommonJS規范

CommonJS分為1.0和1.1兩個版本。

CommmonJS 1.0
  • 模塊上下文

    1. 在一個模塊中,存在一個自由變量“require”函數
      • 這個“rquire”函數接收一個模塊標識符。
      • rquire”返回外部模塊所輸出的API。
      • 如果出現依賴閉環(dependency cycle),那么外部模塊在被它的傳遞依賴(transitive dependencies)所require的時候可能并沒有執行完成,這種情況下“require“返回的對象必須至少包含此外部模塊在調用require函數之前就已經準備完畢的輸出。
      • 如果請求模塊不能返回,那么”require“必須拋出一個錯誤。
    2. 在一個模塊中,存在一個名為”exports“的自由變量,它是一個對象,模塊可以在執行的時候把自身API加入到其中。
    3. 模塊必須使用”exports“對象來作為輸出的唯一表示。
  • 模塊標示符

    1. 模塊標示符是一個由正斜杠分隔的”terms“組成的字符串。
    2. 一個term的必須為駝峰樣式標識符,或者為”.“或”..“。
    3. 模塊標識符可以省略文件名的后綴。比如”.js
    4. 模塊標識符可以是相對路徑(relative)或者絕對路徑(top-level)。如果模塊標識符的開頭是”.“或者”..“則此模塊標識符為相對路徑。
    5. 絕對路徑必須是模塊所在命名空間的根。
    6. 相對路徑必須是相對于當前require的模塊。
  • 未規范
    此規范對于如下關于協同工作能力方面的重要內容未進行規范:

    1. 模塊是否可以通過數據庫、文件系統或者工廠函數進行存儲或者可以通過鏈接庫進行內部交換。
    2. 模塊加載器是否應該支持PATH變量用來解析模塊標識符。
  • 單元測試

  • 示例代碼

    • 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.11.0相比主要在 模塊上下文(Module Context)部分增加了一些規范。

  • 模塊上下文
    1. 在一個模塊中,存在一個自由變量“require”函數
      • 這個“rquire”函數接收一個模塊標識符。
      • rquire”返回外部模塊所輸出的API。
      • 如果出現依賴閉環(dependency cycle),那么外部模塊在被它的傳遞依賴(transitive dependencies)所require的時候可能并沒有執行完成,這種情況下“require“返回的對象必須至少包含此外部模塊在調用require函數之前就已經準備完畢的輸出。
      • 如果請求模塊不能返回,那么”require“必須拋出一個錯誤。
      • require有一個只讀的、不可刪除的”main“屬性?!?strong>main“相當于程序根目錄的module。如果設置了該屬性,則其必須和根目錄的module指向相同的對象。
      • require有個paths屬性,該屬性是一個具有優先秩序的路徑數組,優先級從高到低,路徑一直回朔到地根模塊目錄。
        1. paths屬性不會存在于沙盒中。
        2. 在所有模塊中pathsattribute均指向相同的值。
        3. paths是無法被替換的。
        4. paths的attribute存在時,修改paths的內容可能會導致模塊無法被正確的搜索到。
        5. paths的attribute存在時,它可能只包含了部分path,當模塊加載器在使用這些路徑之前或者之后,去檢查其它的路徑。
        6. paths的attribute存在時,它是模塊加載器使paths規范化、標準化的依據。
    2. 在一個模塊中,存在一個名為”exports“的自由變量,它是一個對象,模塊可以在執行的時候把自身API加入到其中。
      • 模塊必須將exports作為導出對象的唯一工具。
    3. 模塊必須使用”exports“對象來作為輸出的唯一表示。
      • module對象有一個制度的、不可刪除的id屬性。當執行require(module.id)時,可以通過該id找到對應的module并返回module exports出的對象。
      • 當創建一個module對象時,該對象可以有一個URI屬性。該屬性指向對應的模塊源文件。該URI不存在于沙盒中。
附:

原文鏈接:
Modules/1.0
Modules/1.1

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • CommonJS是Node.js使用的模塊化標準,在CommonJS規范中,一個文件就是一個模塊,模塊具有單獨的作...
    我不是黃悠然閱讀 764評論 0 0
  • CommonJS和AMD CommonJS Nodejs的模塊系統就采用CommonJS模式。CommonJS標準...
    Isaacyyy閱讀 570評論 0 1
  • 導讀 內容大部分都是來源于 阮一峰老師的博客,做個搬運工加自己寫一寫。想看原文請移步CommonJS規范 ...
    Estarsyang閱讀 122,162評論 4 49
  • 概念 1、為什么要使用模塊化? 當代碼規模較大或進行團隊協作時,如果不實行模塊化,有可能導致命名沖突----解決命...
    周花花啊閱讀 825評論 0 3
  • 問答 1.為什么要使用模塊化? 要使用模塊化,我們要知道什么是模塊化?首先一個模塊是為了實現特定功能的文件,模塊化...
    GarenWang閱讀 1,540評論 1 1