「從相遇到深愛-Nodejs」-模塊機制

與其餘高級語言相比,如Java有類文件,Python有import機制,Ruby有require,PHP有include和require,JavaScript先天就缺少的一項功能:模塊前端

1 CommonJS規範

1.1 CommonJS的出發點

Web發展中,瀏覽器中出現了不少的標準API,這些過程發生在前端,後端JavaScript的規範卻遠遠落後。主要有如下缺陷:npm

  • 沒有模塊庫
  • 標準庫較少。ECMAScript(官方規範)僅定義了部分核心庫,對於文件系統、IO流等常見需求卻沒有標準的API。
  • 沒有標準接口
  • 缺少包管理系統

Node借鑑CommonJS的Modules規範實現了一套很是易用的模塊系統,NPM對Packages規範的無缺支持使得Node應用在開發過程當中事半功倍。json

1.2 CommonJS的模塊規範

1.模塊引用後端

var math = require('math');

使用require將模塊引入到當前上下文。瀏覽器

2.模塊定義緩存

上下文提供了exports對象用於導出當前模塊的方法或者變量,而且它是惟一導出的出口。在模塊中,還存在一個module對象,它表明模塊自身,而exports是module的屬性。在Node中,一個文件就是一個模塊。單元測試

// math.js
exports.add = function(){
    var sum = 0,
        i = 0,
        args = arguments,
        l = args.length;
    while(i < 1){
        sum += args[i++];
    }
    return sum;
}

3.模塊標識測試

也就是require()內的參數,能夠是相對路徑、絕對路徑。能夠沒有文件後綴.js。ui

2 Node的模塊實現

Node對CommonJS的規範作了取捨。下面來具體看下在使用require,exports和module這些規範時,Node內部的實現過程。code

在Node引入模塊,須要經歷如下3個步驟:

  • 路徑分析
  • 文件定位
  • 編譯執行

在Node中,模塊分爲兩類:

  • Node提供的模塊,即核心模塊
  • 用戶編寫的模塊,即文件模塊

核心模塊在Node源代碼編譯過程當中,編譯進了二進制執行文件。在Node啓動時,部分核心模塊就直接被加載進內存。所以這部分模塊不須要文件定位+編譯過程,而且在路徑分析中優先判斷,所以加載速度最快的。

文件模塊則在運行時動態加載,須要完整的路徑分析、文件定位、編譯執行的過程。

2.1 優先從緩存加載

require()方法對相同模塊的二次加載都一概採用緩存優先的方式,這是第一優先級的。核心模塊的緩存檢查優先於文件模塊的緩存檢查。

3 核心模塊

前面提到,Node的核心模塊在編譯成可執行文件的過程當中被編譯進了二進制文件。

核心模塊分爲C/C++模塊編寫的和JavaScript編寫的兩部分。其中C/C++編寫的存放在src目錄下,JavaScript編寫的存放在lib目錄下。

4 包與NPM

4.1 包結構

包其實是一個存檔文件,即一個目錄直接打包爲.zip或tar.gz格式的文件,安裝後解壓還原爲目錄。符合CommonJS規範的目錄應該包含以下文件:

  • package.json:包描述文件;
  • bin:存放可執行二進制文件的目錄;
  • lib:存放JavaScript代碼;
  • doc:存放文檔
  • test:存放單元測試代碼

4.2 NPM經常使用功能

  • 安裝依賴包:npm install xxx

發佈包:

  • 編寫模塊;
  • 初始化包描述文件:npm init
  • 註冊包倉庫帳號:npm adduser
  • 上傳包:npm publish <folder>。能夠在剛剛建立的package.json文件所在目錄下,執行npm publish .,開始上傳包
  • 管理包權限
    • npm owner ls xxx:列舉出擁有包權限的人
    • npm owner add <user> <package name>
    • npm owner rm <user> <package name>

分析包:

  • 可以使用npm ls命令生成包的依賴樹。

局域NPM

  • 對於企業級局域網NPM包,可搭建私有npm倉庫。
相關文章
相關標籤/搜索