nodejs 中的 NODE_PATH

在使用 nodejs 開發中咱們都免不了要去安裝一些第三方模塊。java

那麼你或多或少的遇到過如下一些問題node

再繼續閱讀以前,咱們先來弄清楚一個概念。git

npm install --global xxx 屬於全局安裝
npm install xxx 屬於本地安裝github

安裝的模塊太多項目太臃腫,模塊沒能複用

你寫一個項目 A 須要安裝一個 express 模塊,又開發一個項目 B 又須要安裝一個 express 模塊算法

項目中依賴包太多,文件過多,模塊無法複用,各類問題浮現

因爲 安裝的依賴包過多(並且依賴包嵌套依賴包),若是一個項目依賴多的話,(好比依賴 gulp 系列 或 grunt 系列的項目構模塊)那麼一個項目能夠說輕輕鬆鬆上百兆。若是想給想項目更換一個目錄,都發現是癡心妄想了。(基本都是1-10KB的小文本文件組成了一個100多MB的項目,那得有多少個文件啊!想一想若是像java那樣,模塊都是以jar包存在的壓縮歸檔文件可能也好一點)。更別提部署了。express

其實這裏面的代碼也就是 幾十KB到1兆 是咱們本身寫的代碼。這些文件想實現 複製,移動,部署是很方面的。npm

給部署帶來的困擾

若是你部署過 node 項目到遠程服務器,node_modules 目錄的上傳將是一件恐怖的事情json

NODE_PATH 出現,模塊複用,最佳實踐方案

NODE_PATH 是幹什麼的呢?
操做系統中都會有一個PATH環境變量,想必你們都知道,當系統調用一個命令的時候,就會在PATH變量中註冊的路徑中尋找,若是註冊的路徑中有就調用,不然就提示命令沒找到。gulp

-> export PATH=$PATH: # 將 /usr/bin 追加到 PATH 變量中 -> export NODE_PATH="/usr/lib/node_modules;/usr/local/lib/node_modules" #指定 NODE_PATH 變量 

NODE_PATH 就是NODE中用來尋找模塊所提供的路徑註冊環境變量。咱們可使用上面的方法指定NODE_PATH環境變量。而且用;分割多個不一樣的目錄。windows

加載時機

關於 node 的包加載機制我就不在這裏廢話了。NODE_PATH中的路徑被遍歷是發生在
從項目的根位置遞歸搜尋 node_modules 目錄,直到文件系統根目錄的 node_modules,若是尚未查找到指定模塊的話,就會去 NODE_PATH中註冊的路徑中查找

解決問題

基於 nodejs 的包加載路徑搜索算法,咱們能夠 採用全局安裝的方式,將咱們的包安裝到全局。
這樣,咱們的項目就能夠共享全局中的依賴包。

瞭解全局

npm root -g 查看在你的系統中全局的路徑。
咱們也能夠經過
npm config ls -l | grep prefix (*nix) 系統中
或是
npm config get prefix
來查看全局路徑。
是的 prefix 字段就是全局base path

怎麼設置全局路徑呢?

# in *nix npm config set prefix /path/to/global # in windows npm config set prefix C:\\Users\\pc\\global 

求同存異,解決模塊版本問題

差別性的解決方法

若是 項目A 使用了,express的3.x版本,項目B 使用了 express的4.x版本,那這種狀況該怎麼辦呢?

能夠將 NODE_PATH 指定的位置中存放 express的4.x版本,再將 項目B的 node_modules 目錄中放置 3.x 版本。

這樣就解決了模塊版本差別性問題。

因此說,兩種安裝方式咱們並非只是用其中的一種,他們能夠結合使用,根據 nodejs 的包加載機制,咱們能夠靈活使用。

部署再也不是問題

在部署以前,咱們能夠將咱們項目的全部能夠全局安裝的模塊,都以全局的安裝方式安裝到服務器中。接下來咱們就能夠輕鬆,上傳咱們的項目到服務器中了。這樣上傳也會變得的很快。

而後配置咱們的 NODE_PATH 環境變量。怎麼配置上面也談過,這裏就不用多說了。(由於項目的部署方式多種多樣,因此具體狀況能夠自行決定。)

本人是使用 PM2 部署管理Nodejs項目,因此我寫在 配置文件中。

帶來的問題

是的這種方式也有缺點。由於在使用 --global 參數的時候 --save--save-dev參數是無效的。
這樣就帶來一個問題。此時 package.json 中的 dependencies, devDependencies 將沒法享受到npm自動更新帶來的便利,不使用 dependencies, devDependencies 字段對咱們的項目管理來講是不可接受的。

如何解決

我有一個不是很優雅地解決方法,可是也算是解決了這個問題,但願有更好解決辦法的同窗給我留言。
我寫了一個小工具(npmafter),它的使用方法很簡單, 它是跨平臺的。兼容(Mac,Windows,Linux)。(我沒有發佈到github上,由於感受會有更好的辦法)

$ npm install -g http://yinchangsheng-blog.qiniudn.com/blog/nodejs/npmafter.tgz # install # 而後咱們安裝任何模塊就能夠這樣 $ npm install express -g | npmafter $ npm install request q -g | npmafter --save $ npm install mocha chai -g | npmafter --save-dev 

是的 package.json 文件就會獲得更新。
好的,若是你不糾結這個問題那麼這個問題就算是解決了。

使用 NODE_PATH 能夠很好的解決項目開發部署的問題。

相關文章
相關標籤/搜索