跳到內容

解決 Node + tsx 出現的 "__name is not a function" 崩潰問題

你原本只是想簡化開發流程,把工具鏈換成更輕量的選擇,結果程式碼連啟動都辦不到。最讓人挫折的是,這段程式碼在之前的環境跑得好好的,一換到 Node + tsx 就噴出一個完全看不懂的 TypeError: __name is not a function。

這種錯誤通常發生在底層工具處理程式碼轉換時,雖然你的邏輯沒變,但執行環境的改變讓那些隱藏的輔助函式(Helpers)出了差錯。

  • Node: v25.x (已在 v25.3.0 觀察到) 或 v22.22.0
  • tsx: 4.21.0
  • OS: macOS (或其他可運行 Node 25 的平台)
  • pnpm: 用於安裝依賴

如果你懷疑遇到了這個問題,可以用以下步驟在 OpenClaw 專案中快速重現:

  1. 確認環境並安裝

    Terminal window
    node --version
    pnpm install
  2. 執行啟動指令

    Terminal window
    node --import tsx src/entry.ts status
  3. 使用最小重現腳本 如果上述指令報錯,你可以執行專案內提供的重現檔案來確認:

    Terminal window
    node --import tsx scripts/repro/tsx-name-repro.ts

這個崩潰發生在 tsx 使用 esbuild 轉換 TS/ESM 的過程中。esbuild 的 keepNames 功能會產生一個 __name 輔助函式來包裹函式定義。當你在 Node 25(或部分 Node 22 版本)執行時,這個輔助函式可能在載入路徑中遺失或被覆寫,導致執行時雖然抓得到 __name 這個變數,但它並不是一個函式。

這是目前最快的替代方案。如果你在開發環境中可以使用 Bun,切換回去可以避開 tsx 的轉換問題。

解決方案 2:使用 tsc 編譯後執行

Section titled “解決方案 2:使用 tsc 編譯後執行”

手動使用 tsc 進行編譯,然後直接用 Node 執行產出的檔案,這已經確認可以繞過 tsx 的報錯:

Terminal window
# 開啟 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

OpenClaw Expert

還是卡住了?

如果這篇文件沒有解決你的情境,直接問 OpenClaw Expert,拿到可執行步驟。