Watch at Ease看見世界,讀懂生活。

科技 · 實用指南

Node 顯示 ERR_REQUIRE_ESM?更改模組設定前先追查執行時呼叫者

原始碼可能使用 import,但編譯後 JavaScript、依賴或測試工具仍呼叫 require()。先證明執行時邊界,再選擇完整 ESM 遷移、動態 import 橋接或經評審的暫時版本固定。

原創技術圖:從原始碼、編譯輸出與包中繼資料追到 Node 執行時。
原創示意圖:先沿執行路徑稽核。 Watch at Ease

ERR_REQUIRE_ESM 指向執行時模組格式邊界。TypeScript、Babel、Vite、Electron、Jest 或傳遞依賴可能產生 require(),因此實際執行行不一定等於原始碼。

保留第一份完整堆疊,記錄 Node 版本並檢查實際執行的 JavaScript,再修改 package.json。

先保存執行時證據

保存堆疊、命令、工作目錄、Node/套件管理器版本與 lockfile 修訂,標記目標 ESM 與首個非內部呼叫者。

不要先刪 node_modules 或 lockfile,以免改變依賴圖並清除原始邊界。

檢查實際執行輸出

開啟堆疊指出的 dist、out、build 或 Electron bundle,確認輸出是否仍為 require()。

記錄 TypeScript module、moduleResolution、檔案副檔名與最近 package.json type。

找出包邊界與擁有者

由 lockfile 和依賴樹確認版本,判斷呼叫屬於本身、直接依賴或傳遞依賴,並閱讀 exports/type。

記錄 Node 版本;解析回歸和頂層 await 與一般 ESM-only 升級需要不同修復。

選擇單一修復路線

可完整遷移時一起調整包邊界、編譯輸出、相對副檔名與入口。保留 CommonJS 時只在可非同步化的自有邊界使用動態 import。

依賴內部失敗應優先升級上游;暫時固定版本需記錄原因、風險與移除日期。

在相同邊界驗證

清理舊輸出後重建,不意外重寫 lockfile;確認 require 已消失或橋接得到正確匯出。

用原 Node 版本執行命令、測試與生產入口,保存依賴樹與輸出片段。

原創技術圖:三條修復路線匯合到驗證結果。
原創示意圖:證明邊界後再遷移、橋接或固定。 Watch at Ease