寫完前一篇「Node.js 爬蟲開發新手技巧」後發現,在不同的資料夾執行程式碼,有的可以正常執行,有的會報錯「Cannot find module 'xxxxx'」表示找不到第三方模組。
研究後才發現,Node.js 讀取第三方模組有其 SOP,若在系統預設的所有相關資料夾都找不到第三方模組檔案,就會出現以上的錯誤訊息。
這樣的設計很是讓人困擾,如果開了很多不同的爬蟲專案,每個專案都存放在專屬的資料夾,那豈不是同樣的許多第三方模組,都得所有專案個別安裝一次?如果有 10 個專案要用到 axios 模組,硬碟就會有 10 個地方要安裝 axios 模組,存放 10 組一模一樣的檔案,徒然佔用大量硬碟空間。
雖然 npm 有參數 -g 可以設定為全域安裝,然而這對於引用第三方模組是沒有幫助的,專案仍然會報錯無法抓到第三方模組。而如果每次為了成功引用第三方模組,都得查詢及填入冗長又記不住的完整路徑,也是滿浪費時間的。為了日後管理、操作方便及節省空間,研究了下這個問題要如何解決,請見本篇的整理。
(圖片出處: pixabay.com)
npm i 模組名稱 安裝第三方模組後,會自動存放在該「專案資料夾」的「 node_modules 資料夾」,才能讓 require 成功讀取。
d:\node )下建立兩個資料夾,名稱分別為 node_global (全域模組)、node_cache (全域快取)
接著執行以下兩個指令:
yarn global dir 查看,路徑的確變更了。
然而接著使用 yarn global add 模組名稱 ,會發現並沒有安裝到全域資料夾!
2. 修改 yarn 全域資料夾位置
找到 yarn 官網討論串「how to change global folder」,這裡說明了如何修改:
一、Node.js 讀取模組邏輯
官方對於如何使用 require 載入模組,提供了一大段邏輯程式碼,有興趣可參考「require high-level algorithm」。 相信這個「英文邏輯樹」不容易解讀,這篇「深入Node.js的模組載入機制」提供了中文版說明:1. 優先載入內建模組,即使有同名檔案,也會優先使用內建模組。 2. 不是內建模組,先去快取找。 3. 快取沒有就去找對應路徑的檔案。 4. 不存在對應的檔案,就將這個路徑作為資料夾載入。 5. 對應的檔案和資料夾都找不到就去node_modules下面找。 6. 還找不到就報錯了。所以依照以上邏輯,正常情形我們只有在該「專案資料夾」之下,使用指令
二、能否讀取全域安裝的第三方模組
1. 原理 為了避免在多個專案資料夾重複安裝第三方模組,我想嘗試看看,能否讓 require 讀取全域安裝的第三方模組,找到了這個討論串「NodeJS require a global module/package」。 這個討論串提供了不少作法,有的解法似乎有風險,有的解法適用 Linux,不過提供的概念還是有幫助,Node.js 如通過正確的設定,有辦法可讀取全域安裝的第三方模組。 找到了這篇「Node.js模組全域性安裝路徑配置方法」,即為前述討論串概念的中文操作方法,以下使用 npm 來說明如何操作。 2. 修改全域路徑 首先在安裝 Node.js 的目錄(假設是npm config set prefix "d:\node\node_global"
npm config set cache "d:\node\node_cache"
最後需要修改作業系統的「環境變數」,以 Windows 為例,操作方式為:
- 按
Win+R →「執行指令 sysdm.cpl」→「進階」→「環境變數」 - 「使用者變數」→「新增」→ 變數名稱輸入「NODE_PATH」→ 變數值輸入「d:\node\node_global\node_modules」
- 儲存後,重新啟動 Windows 可生效
三、yarn 操作
以上為 npm 的相關操作,而 yarn 的操作請看以下說明。 1. yarn 全域資料夾位置yarn global dir
執行以上指令可找出 yarn 全域資料夾所在位置,而更改全域資料夾的指令,可參考這篇教學「yarn修改全局安裝路徑和緩存路徑」,範例如下:
yarn config set global-folder "d:\node\node_global"
之後使用 - 同之前步驟,先執行指令 yarn config set global-folder "d:\node\node_global"
- 找到 .yarnrc 這個檔案並開啟
- 將字串
global-folder 改為--global-folder - 之後執行指令
yarn global add 模組名稱 ,就能發現模組出現在全域資料夾了
更多 Node.js 相關文章:
沒有留言:
張貼留言注意事項:
◎ 勾選「通知我」可收到後續回覆的mail!
◎ 請在相關文章留言,與文章無關的主題可至「Blogger 社團」提問。
◎ 請避免使用 Safari 瀏覽器,否則無法登入 Google 帳號留言(只能匿名留言)!
◎ 提問若無法提供足夠的資訊供判斷,可能會被無視。建議先參考這篇「Blogger 提問技巧及注意事項」。
◎ CSS 相關問題非免費諮詢,建議使用「Chrome 開發人員工具」尋找答案。
◎ 手機版相關問題請參考「Blogger 行動版範本的特質」→「三、行動版範本不一定能執行網頁版工具」;或參考「Blogger 行動版範本修改技巧 」,或本站 Blogger 行動版標籤相關文章。
◎ 非官方範本問題、或貴站為商業網站,請參考「Blogger 免費諮詢 + 付費諮詢」
◎ 若是使用官方 RWD 範本,請參考「Blogger 推出全新自適應 RWD 官方範本及佈景主題」→ 不建議對範本進行修改!
◎ 若留言要輸入語法,"<"、">"這兩個符號請用其他符號代替,否則語法會消失!
◎ 為了過濾垃圾留言,所有留言不會即時發佈,請稍待片刻。
◎ 本站「已關閉自刪留言功能」。