如何使用 npm link 進行 node module 測試

卡米哥
5 min readApr 15, 2020

大家好,我是卡米哥,LINE 官方認證的 API 專家,LINE API Expert。目前在維護知名 Node.js 聊天機器人框架 Bottender

今天要來教大家如何使用 npm link 來進行 node module 的測試,如果你正在開發 node module,或你不想要重複下載多份 node module 到你的專案,那麼你一定要學一下,今天會提到的內容如下:

  1. 如何避免 node module 重複下載
  2. 如何使用 npm link 來進行 node module 的測試
  3. 什麼是 npm
  4. 什麼是 node module
  5. 什麼是 npm link

這次試試看先講結論,再講原理。

如何避免 node module 重複下載

要避免 node module 在每個專案都下載一份的方法就是用 npm link {套件名稱} 來安裝套件,而不要用 npm install {套件名稱},只是說那在 git clone 下來一個 Node.js 的專案之後有沒有一個指令可以完成所有的 npm link 我就不知道了,如果有知道怎麼做的朋友歡迎留言。

如何使用 npm link 來進行 npm module 的測試

其實就是在套件資料夾下輸入指令 npm link 把套件裝到全域上,然後再到使用套件的專案資料夾下輸入 npm link {套件名稱} 去連結,這樣就能正常使用了。

以下將詳細說明每個指令實際產生了哪些影響。

什麼是 npm

npm 是 Node.js 的套件管理工具,負責幫你下載專案當中用到的第三方套件(node module)。假設你想要建立一個新的 Node.js 專案,你在一個名為 npm_test 空資料夾下輸入 npm init 後猛按 enter 後,你會獲得 package.json 內容如下:

什麼是 node module

node module 就是包裝成模組化、設計好重複利用的套件。

如何安裝套件

在有了 package.json 之後,你可以在當中加入 dependencies 來記載你會使用到的第三方套件,像這樣:

就表示你在這個專案會使用到 Bottender,你可以用 npm install bottender 透過指令來幫你編輯 package.json,下了指令之後你會發現資料夾當中多了兩個東西:

  • node_modules 資料夾
  • package-lock.json

node_modules 用來存放下載好的第三方套件,而 package-lock.json 紀錄目前安裝的套件版本。

如何安裝套件在全域

除了將模組安裝在專案資料夾的 node_modules 資料夾下(本地安裝)之外,你也可以使用 npm install bottender -g 將 Bottender 套件安裝在你安裝 Node.js 的資料夾下(全域安裝),然後再使用 npm link 將專案的本地資料夾連結到全域資料夾。

如何寫套件

以上講的是如何使用別人寫好的 node module,但如果要自己做一個呢?請參考:如何做出一個好的 NodeJS 模組?

什麼是 npm link

npm link 有兩個用法:

  • npm link:將全域對應的模組資料夾連接到目前專案資料夾
  • npm link {套件名稱}:將目前專案資料夾的 node_modules/{套件名稱} 連結到全域對應的模組資料夾

npm link 的使用

npm link 指令會將目前資料夾下的 package.json 當中所記載的 name 作為套件名稱,在 Node.js 安裝資料夾下建立一個捷徑,從全域對應的模組資料夾連結到當前資料夾。

舉例來說,當我在 bottender 專案的 packages/bottender 資料夾下輸入 npm link 時,會建立以下的捷徑:

當我實際去上面提到的資料夾看的時候發現多了一個捷徑:

也就是說 npm link 會在全域安裝路徑建立一個捷徑到目前資料夾。

在已經全域安裝的情況下使用 npm link 會怎樣?

若是已經有全域安裝過 Bottender 的情況下,對 Bottender 專案資料夾輸入指令 npm link 會導致全域安裝的內容消失,改用捷徑取代。

在已經使用 npm link 的情況下使用全域安裝會怎樣?

若是已經有全域安裝過 Bottender 的情況下,輸入指令 npm install bottender -g 會導致連結的捷徑消失,改用全域安裝的內容取代。

取消 npm link 的方法

只要輸入 npm unlink 就可以將全域安裝路徑的捷徑移除。

npm link {套件名稱} 的使用

npm link {套件名稱} 其中的 {套件名稱} 代表任意的套件名稱,比方說 npm link bottender 這個指令的功能是安裝 Bottender,但是使用全域安裝的內容,實際上你執行 npm link bottender 之後會看到以下的訊息:

假設我在 node_module_test 專案下想要使用 Bottender,我輸入指令 npm link bottender 會造成的影響是建立上述的捷徑,在 Finder 當中會看到下圖:

這是在專案資料夾下的 node_modules 資料夾,可以看到多了一個捷徑叫做 bottender,是連結到全域安裝的地方。

在還沒有全域安裝的情況下執行 npm link bottender 會怎樣?

npm link bottender 會檢查全域安裝是否存在,如果不存在的話就會執行全域安裝後,再建立捷徑。

覺得寫得不錯的話歡迎分享哦~

--

--