nodejs本地模式和全域性模式

edagarli發表於2014-04-17
npm在預設情況下會從http://npmjs.org搜尋或下載包,
將包安裝到當前目錄的node_modules
子目錄下。
如果你熟悉 Ruby 的 gem 或者 Python 的 pip,你會發現 npm 與它們的
行為不同,gem 或 pip 總是以全域性模式安裝,使包可以供所有的程式使用,
而 npm 預設會把包安裝到當前目錄下。這反映了 npm 不同的設計哲學。如
果把包安裝到全域性,可以提高程式的重複利用程度,避免同樣的內容的多
份副本,但壞處是難以處理不同的版本依賴。如果把包安裝到當前目錄,
或者說本地,則不會有不同程式依賴不同版本的包的衝突問題,同時還減
輕了包作者的 API 相容性壓力,

但缺陷則是同一個包可能會被安裝許多次。

在使用 npm 安裝包的時候,
有兩種模式:
本地模式和全域性模式。
預設情況下我們使用 npm
即把包安裝到當前目錄的 node_modules 子目錄下。
Node.js
install命令就是採用本地模式,
的 require 在載入模組時會嘗試搜尋 node_modules 子目錄,因此使用 npm 本地模式安裝
的包可以直接被引用。
npm 還有另一種不同的安裝模式被成為全域性模式,使用方法為:
npm [install/i] -g [package_name]
與本地模式的不同之處就在於多了一個引數 -g。
我們在 介紹 supervisor那個小節中使用
了 npm install -g supervisor 命令,就是以全域性模式安裝 supervisor。
為什麼要使用全域性模式呢?多數時候並不是因為許多程式都有可能用到它,
為了減少多
重副本而使用全域性模式,而是因為本地模式不會註冊 PATH 環境變數。舉例說明,我們安裝
supervisor 是為了在命令列中執行它,譬如直接執行 supervisor script.js,這時就需要在 PATH
環境變數中註冊 supervisor。npm 本地模式僅僅是把包安裝到 node_modules 子目錄下,其中
的 bin 目錄沒有包含在 PATH 環境變數中,不能直接在命令列中呼叫。而當我們使用全域性模
式安裝時,
npm 會將包安裝到系統目錄,
譬如 /usr/local/lib/node_modules/,
同時 package.json 文
件中 bin 欄位包含的檔案會被連結到 /usr/local/bin/。/usr/local/bin/ 是在PATH 環境變數中預設
定義的,因此就可以直接在命令列中執行 supervisor script.js命令了。
使用全域性模式安裝的包並不能直接在 JavaScript 檔案中用 require 獲
得,因為 require 不會搜尋 /usr/local/lib/node_modules/。


總而言之,當我們要把某個包作為工程執行時的一部分時,通過本地模式獲取,如果要
在命令列下使用,則使用全域性模式安裝。


相關文章