Diagnostics
Node + tsx 崩潰
Node + tsx「__name is not a function」崩潰
摘要
透過 Node 搭配 tsx 執行 OpenClaw 會在啟動時失敗,並顯示:
[openclaw] Failed to start CLI: TypeError: __name is not a function
at createSubsystemLogger (.../src/logging/subsystem.ts:203:25)
at .../src/agents/auth-profiles/constants.ts:25:20
這是在將開發腳本從 Bun 切換到 tsx 之後開始發生的(commit 2871657e,2026-01-06)。相同的執行階段路徑在 Bun 下可以正常運作。
環境
- Node:v25.x(在 v25.3.0 上觀察到)
- tsx:4.21.0
- 作業系統:macOS(也可能在其他執行 Node 25 的平台上重現)
重現方式(僅 Node)
# in repo root
node --version
pnpm install
node --import tsx src/entry.ts status
存放庫中的最小重現
node --import tsx scripts/repro/tsx-name-repro.ts
Node 版本檢查
- Node 25.3.0:失敗
- Node 22.22.0(Homebrew
node@22):失敗 - Node 24:此處尚未安裝;需要驗證
備註/假設
tsx使用 esbuild 轉換 TS/ESM。esbuild 的keepNames會產生__name輔助函式,並用__name(...)包裝函式定義。- 崩潰表示
__name在執行階段存在但不是函式,這暗示在 Node 25 loader 路徑中,此模組的輔助函式遺失或被覆寫。 - 其他 esbuild 使用者也曾回報類似的
__name輔助函式問題,原因是輔助函式遺失或被改寫。
回歸歷史
2871657e(2026-01-06):腳本從 Bun 改為 tsx,讓 Bun 成為可選項。- 在此之前(Bun 路徑),
openclaw status和gateway:watch可正常運作。
因應方式
-
對開發腳本使用 Bun(目前的臨時還原方式)。
-
使用
tsgo進行存放庫型別檢查,然後執行建置後的輸出:pnpm tsgo node openclaw.mjs status -
歷史備註:在偵錯此 Node/tsx 問題時曾於此使用
tsc,但存放庫型別檢查 lane 現在使用tsgo。 -
如果可能,在 TS loader 中停用 esbuild keepNames(避免插入
__name輔助函式);tsx 目前未公開此選項。 -
使用
tsx測試 Node LTS(22/24),確認問題是否為 Node 25 專屬。
參考資料
- https://opennext.js.org/cloudflare/howtos/keep_names
- https://esbuild.github.io/api/#keep-names
- https://github.com/evanw/esbuild/issues/1031
下一步
- 在 Node 22/24 上重現,以確認是否為 Node 25 回歸。
- 測試
tsxnightly,或在存在已知回歸時釘選到較早版本。 - 如果可在 Node LTS 上重現,帶著
__name堆疊追蹤向上游提交最小重現。