Documentation Index
Fetch the complete documentation index at: https://openclaw.zhcndoc.com/llms.txt
Use this file to discover all available pages before exploring further.
Node + tsx “__name 不是一个函数” 崩溃
摘要
通过 Node 使用tsx 运行 OpenClaw 时,会在启动阶段失败,报错如下:
tsx 之后(提交 2871657e,2026-01-06)。相同的运行路径在 Bun 下是可用的。
环境
- Node: v25.x(已在 v25.3.0 上观察到)
- tsx: 4.21.0
- 操作系统: macOS(在其他运行 Node 25 的平台上也大概率可复现)
复现(仅 Node)
仓库中的最小复现
Node 版本检查
- Node 25.3.0:失败
- Node 22.22.0(Homebrew
node@22):失败 - Node 24:这里尚未安装;需要验证
说明 / 假设
tsx使用 esbuild 来转换 TS/ESM。esbuild 的keepNames会生成一个__namehelper,并用__name(...)包裹函数定义。- 崩溃表明
__name确实存在,但在运行时不是函数,这意味着在 Node 25 的加载器路径中,该模块的 helper 丢失或被覆盖了。 - 在其他使用 esbuild 的场景中,也曾报告过类似的
__namehelper 问题,通常是 helper 丢失或被重写所致。
回归历史
2871657e(2026-01-06):脚本从 Bun 改为 tsx,以便让 Bun 成为可选项。- 在此之前(Bun 路径),
openclaw status和gateway:watch都可以正常工作。
临时解决方案
- 开发脚本继续使用 Bun(当前的临时回退)。
-
使用
tsgo进行仓库类型检查,然后运行构建产物: -
历史说明:在调试这个 Node/tsx 问题时这里曾使用
tsc,但仓库的类型检查流程现在使用tsgo。 -
如果可能,在 TS 加载器中禁用 esbuild 的 keepNames(这样可以避免插入
__namehelper);但 tsx 目前没有暴露这个选项。 -
测试 Node LTS(22/24)配合
tsx,看看问题是否仅限于 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堆栈跟踪向上游提交一个最小复现。