解決 Node + tsx 出現的 "__name is not a function" 崩潰問題
你原本只是想簡化開發流程,把工具鏈換成更輕量的選擇,結果程式碼連啟動都辦不到。最讓人挫折的是,這段程式碼在之前的環境跑得好好的,一換到 Node + tsx 就噴出一個完全看不懂的 TypeError: __name is not a function。
這種錯誤通常發生在底層工具處理程式碼轉換時,雖然你的邏輯沒變,但執行環境的改變讓那些隱藏的輔助函式(Helpers)出了差錯。
需要準備的東西
Section titled “需要準備的東西”- Node: v25.x (已在 v25.3.0 觀察到) 或 v22.22.0
- tsx: 4.21.0
- OS: macOS (或其他可運行 Node 25 的平台)
- pnpm: 用於安裝依賴
如果你懷疑遇到了這個問題,可以用以下步驟在 OpenClaw 專案中快速重現:
-
確認環境並安裝
Terminal window node --versionpnpm install -
執行啟動指令
Terminal window node --import tsx src/entry.ts status -
使用最小重現腳本 如果上述指令報錯,你可以執行專案內提供的重現檔案來確認:
Terminal window node --import tsx scripts/repro/tsx-name-repro.ts
為什麼會報錯?
Section titled “為什麼會報錯?”這個崩潰發生在 tsx 使用 esbuild 轉換 TS/ESM 的過程中。esbuild 的 keepNames 功能會產生一個 __name 輔助函式來包裹函式定義。當你在 Node 25(或部分 Node 22 版本)執行時,這個輔助函式可能在載入路徑中遺失或被覆寫,導致執行時雖然抓得到 __name 這個變數,但它並不是一個函式。
解決方案 1:改用 Bun 執行
Section titled “解決方案 1:改用 Bun 執行”這是目前最快的替代方案。如果你在開發環境中可以使用 Bun,切換回去可以避開 tsx 的轉換問題。
解決方案 2:使用 tsc 編譯後執行
Section titled “解決方案 2:使用 tsc 編譯後執行”手動使用 tsc 進行編譯,然後直接用 Node 執行產出的檔案,這已經確認可以繞過 tsx 的報錯:
# 開啟 tsc 監控模式pnpm exec tsc --watch --preserveWatchOutput
# 執行編譯後的檔案node --watch openclaw.mjs status經測試,使用 pnpm exec tsc -p tsconfig.json 搭配 node openclaw.mjs status 在 Node 25 上運作正常。
如有更多設定問題,請諮詢 AI Setup Assistant
OpenClaw Expert
還是卡住了?
如果這篇文件沒有解決你的情境,直接問 OpenClaw Expert,拿到可執行步驟。