寫完前一篇「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 相關文章: