Lỗi Crash Node + tsx “__name is not a function”
Tóm tắt
Khi chạy OpenClaw qua Node vớitsx, chương trình gặp lỗi ngay khi khởi động:
tsx (commit 2871657e, ngày 06-01-2026). Trước đó, đường dẫn runtime này hoạt động tốt với Bun.
Môi trường
- Node: v25.x (quan sát trên v25.3.0)
- tsx: 4.21.0
- Hệ điều hành: macOS (có thể tái hiện trên các nền tảng khác chạy Node 25)
Tái hiện lỗi (chỉ với Node)
Tái hiện lỗi tối thiểu trong repo
Kiểm tra phiên bản Node
- Node 25.3.0: gặp lỗi
- Node 22.22.0 (Homebrew
node@22): gặp lỗi - Node 24: chưa cài đặt; cần xác minh thêm
Ghi chú / giả thuyết
tsxsử dụng esbuild để chuyển đổi TS/ESM. Tính năngkeepNamescủa esbuild tạo ra một helper__namevà bao bọc định nghĩa hàm với__name(...).- Lỗi này cho thấy
__nametồn tại nhưng không phải là một hàm khi chạy, điều này ngụ ý helper bị thiếu hoặc bị ghi đè trong đường dẫn loader của Node 25. - Các vấn đề tương tự với helper
__nameđã được báo cáo trong các trường hợp khác khi helper bị thiếu hoặc bị ghi đè.
Lịch sử hồi quy
2871657e(06-01-2026): script chuyển từ Bun sang tsx để làm cho Bun không bắt buộc.- Trước đó (đường dẫn Bun),
openclaw statusvàgateway:watchhoạt động tốt.
Cách khắc phục
- Sử dụng Bun cho script dev (tạm thời quay lại).
-
Sử dụng Node + tsc watch, sau đó chạy output đã biên dịch:
-
Đã xác nhận tại chỗ:
pnpm exec tsc -p tsconfig.json+node openclaw.mjs statushoạt động trên Node 25. -
Tắt esbuild keepNames trong TS loader nếu có thể (ngăn chặn chèn helper
__name); hiện tại tsx không hỗ trợ điều này. -
Thử nghiệm Node LTS (22/24) với
tsxđể xem liệu vấn đề có chỉ xảy ra trên Node 25 hay không.
Tham khảo
- https://opennext.js.org/cloudflare/howtos/keep_names
- https://esbuild.github.io/api/#keep-names
- https://github.com/evanw/esbuild/issues/1031
Bước tiếp theo
- Tái hiện lỗi trên Node 22/24 để xác nhận hồi quy trên Node 25.
- Thử nghiệm
tsxphiên bản nightly hoặc quay lại phiên bản trước nếu có hồi quy đã biết. - Nếu lỗi tái hiện trên Node LTS, gửi báo cáo tối thiểu lên upstream với stack trace của
__name.