大家好,我是卡米哥,LINE 官方認證的 API 專家,LINE API Expert。目前在維護知名 Node.js 聊天機器人框架 Bottender。
今天要來教大家如何使用 npm link 來進行 node module 的測試,如果你正在開發 node module,或你不想要重複下載多份 node module 到你的專案,那麼你一定要學一下,今天會提到的內容如下:
- 如何避免 node module 重複下載
- 如何使用 npm link 來進行 node module 的測試
- 什麼是 npm
- 什麼是 node module
- 什麼是 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 會檢查全域安裝是否存在,如果不存在的話就會執行全域安裝後,再建立捷徑。
覺得寫得不錯的話歡迎分享哦~