Vite 出現 error while updating dependencies 怎麼修?先查快取與 linked package
Vite 開發伺服器顯示 error while updating dependencies 時,先不要刪除 lockfile 或整個 node_modules。這通常是 dev server 的 dependency pre-bundling 沒有完成,常見邊界包括 node_modules/.vite 快取、linked package、lockfile/設定變更、ESM/CommonJS 格式和檔案路徑大小寫。
最短排查路徑是:停止 dev server → 用 vite --force 重建預先打包 → 若仍失敗,再檢查 linked package 和 optimizeDeps → 最後才清除 Vite 快取。這篇的命令與判斷以官方文件為準;沒有在本機重現你的錯誤,所以不會把單一 GitHub issue 當成所有案例的根因。
先判斷錯誤發生在哪個階段
先保留完整錯誤訊息,並回答:
| 問題 | 判斷 |
|---|---|
只有 pnpm dev 失敗,pnpm build 成功 | 優先查 dev dependency pre-bundling 與瀏覽器快取 |
| build 與 dev 都失敗 | 先查 import、ESM/CommonJS、路徑大小寫或真正的套件錯誤 |
| 安裝 linked workspace package 後才出現 | 優先查 optimizeDeps.include、套件輸出格式與依賴圖 |
| 只有某台電腦或某個 branch 失敗 | 比對 lockfile、Node/pnpm 版本、OS 路徑與殘留 .vite 快取 |
先做不改 lockfile 的診斷:
pnpm why <suspected-package>pnpm list vite --depth 0git diff -- package.json pnpm-lock.yaml vite.config.*第一步:強制重建 Vite 預先打包
Vite 只在 dev 使用 dependency pre-bundling,產物預設放在 node_modules/.vite。官方建議在依賴或 lockfile 變更後使用 --force,讓 Vite 忽略既有的 optimized dependency cache:
pnpm exec vite --force如果專案的 dev script 已經啟動 Vite,可以把參數傳進去:
pnpm dev -- --force瀏覽器也可能保留舊的 optimized dependency 回應。重新開啟 DevTools,暫時勾選 Disable cache,再重新載入頁面。這一步只清理/重建 Vite 的 dev 預打包,不會替你修正真正的 import 或套件格式錯誤。
第二步:檢查 linked package 是否被預先打包
Vite 對 node_modules 外的 linked package 不一定會自動預先打包。這在 pnpm workspace、pnpm link 或 monorepo 中很常見;linked package 如果不是 ESM,也可能需要明確加入 optimizeDeps.include。
import { defineConfig } from 'vite';
export default defineConfig({ optimizeDeps: { include: ['linked-package'], },});接著檢查 linked package 的 package.json:
exports、main、module是否指向實際存在的檔案。- dev 時是否輸出 ESM;若只有尚未編譯的 TypeScript,是否需要先啟動 package build 或設定正確的 source entry。
- package 依賴是否真的寫在自己的
dependencies,而不是只靠 workspace 根目錄碰巧提供。 - 是否因為 package 名稱、import path 或檔案大小寫在 macOS 可用,到了 Linux 才失敗。
如果是一般 CJS dependency,不要把它任意放進 optimizeDeps.exclude;Vite 官方設定文件特別提醒,CJS dependency 排除後可能留下瀏覽器無法直接使用的格式。
第三步:把 ENOENT rename 當成症狀,不是結論
某些 Vite issue 會看到類似以下訊息:
error while updating dependenciesError: ENOENT: no such file or directory, rename .../node_modules/.vite/deps_temp .../node_modules/.vite/deps這代表更新 optimized dependency 時發生檔案操作錯誤,但不單獨證明根因一定是權限、某一個套件或 Vite 本身。先用 --force 重建,再從完整 log 查是誰觸發重新掃描;如果每次都在同一個 linked package 或同一個 import 失敗,應修正依賴圖,而不是反覆刪 cache。
可以在停止 dev server 後只移除 Vite 的快取目錄:
rm -rf node_modules/.vitepnpm dev這個命令的目標是明確的 Vite cache,不是整個 node_modules,也不是 pnpm-lock.yaml。若專案有多個 package,確認你刪除的是實際啟動 dev server 的 workspace 目錄。
第四步:檢查 lockfile、config 與 ESM 邊界
Vite 會把 lockfile、Vite config 和 NODE_ENV 納入 cache 判斷。以下變更都可能觸發重新掃描或暴露舊問題:
- lockfile 更新但沒有重新安裝。
vite.config.*改了 alias、plugin、resolve或optimizeDeps。- package 從 ESM 改成 CJS,或反過來。
- import 的檔名大小寫與實體檔案不同。
- 在 config 中使用 Node-only API,卻把它當成瀏覽器依賴處理。
依序執行:
pnpm install --frozen-lockfilepnpm exec vite --forcepnpm build如果 pnpm install --frozen-lockfile 失敗,先修正 lockfile 與 package manifest 的一致性;不要在排查 dev server 時順便重新解決所有相依版本。若只有 build 失敗,再轉向 Vite 自訂 chunking 的建置檢查;它和 dev dependency cache 是不同問題。
怎麼確認修好了
修正後不要只看 dev server 不再報錯,至少依序驗證:
- 冷啟動 dev server,確認第一次 dependency scan 能完成。
- 重新載入頁面,確認 optimized dependency 不再反覆更新。
- 修改一個 linked package,確認 HMR 或重新載入行為符合預期。
- 執行
pnpm build,確認 production bundling 沒有新增 import error。 - 用乾淨 checkout 或 CI 跑一次,排除本機
.vitecache 偶然掩蓋問題。
如果專案本身還在整理環境變數與 Vite config,可以搭配 Vite 環境變數與 mode 設定 檢查 NODE_ENV、.env 與 config 讀取時機,不要把所有差異都塞進 optimizeDeps.include。
常見問題
Q: 直接刪除 node_modules 再安裝最快嗎?
A: 有時能暫時消失,但它會掩蓋真正的 linked package、lockfile 或 ESM 問題。先用 vite --force,再只清除 node_modules/.vite;只有在安裝本身損壞且已保存 lockfile 的情況,才考慮更大範圍的重裝。
Q: optimizeDeps.include 加越多越好嗎?
A: 不是。只加入 Vite 無法從依賴圖正確發現、但 dev 時確實要載入的 linked package 或深層 import。過度 include 會增加掃描時間,並讓設定更難維護。
Q: pnpm build 成功,為什麼 dev 還是會報錯?
A: production build 和 dev dependency pre-bundling 是不同流程。dev 會處理瀏覽器載入、HMR、optimized dependency cache 和 linked package;build 成功只能排除部分 bundler 問題,不能證明 dev cache 已正常。
參考資料: