科技 · 實用指南
Node 顯示 ERR_REQUIRE_ESM?更改模組設定前先追查執行時呼叫者
原始碼可能使用 import,但編譯後 JavaScript、依賴或測試工具仍呼叫 require()。先證明執行時邊界,再選擇完整 ESM 遷移、動態 import 橋接或經評審的暫時版本固定。

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 版本執行命令、測試與生產入口,保存依賴樹與輸出片段。
