Diagnostics
Sự cố Node + tsx
Sự cố Node + tsx "__name is not a function"
Trạng thái
Đã khắc phục. Sự cố này không tái hiện với phiên bản tsx hiện tại được ghim trong
package.json (4.22.3) hoặc trên các bản phát hành Node hiện tại. Nội dung này được giữ lại phòng trường hợp
một bản nâng cấp tsx/esbuild trong tương lai gây ra lại sự cố.
Triệu chứng ban đầu
Việc chạy các tập lệnh phát triển OpenClaw thông qua tsx không thể khởi động và báo lỗi:
[openclaw] Failed to start CLI: TypeError: __name is not a function at createSubsystemLogger (src/logging/subsystem.ts) at <caller> (src/agents/auth-profiles/constants.ts)Số dòng được lược bỏ; cả hai tệp đã thay đổi kể từ sự cố ban đầu và các dòng cụ thể không còn khớp.
Sự cố này xuất hiện sau khi các tập lệnh phát triển chuyển từ Bun sang tsx (2871657e,
2026-01-06) để Bun trở thành tùy chọn. Luồng tương đương dựa trên Bun không gặp sự cố.
Ban đầu, sự cố được quan sát trên Node v25.3.0 ở macOS; các nền tảng khác chạy
Node 25 cũng được cho là có khả năng bị ảnh hưởng.
Nguyên nhân
tsx chuyển đổi TS/ESM thông qua esbuild với keepNames: true được mã hóa cố định trong
các tùy chọn chuyển đổi. Thiết lập đó khiến esbuild bọc các khai báo hàm/lớp có tên
trong lời gọi đến trình trợ giúp __name để fn.name được giữ nguyên sau quá trình rút gọn
và đóng gói. Sự cố này cho thấy trình trợ giúp đã bị thiếu hoặc bị che khuất tại vị trí gọi
của mô-đun đó trong tổ hợp tsx/Node bị ảnh hưởng, vì vậy __name(...)
đã phát sinh lỗi thay vì trả về giá trị đã bọc.
Kiểm tra tái hiện hiện tại
node --versionpnpm installnode --import tsx src/entry.ts statusCách tái hiện tối thiểu, độc lập (chỉ tải mô-đun từ dấu vết ngăn xếp ban đầu):
node --import tsx scripts/repro/tsx-name-repro.tsCả hai lệnh hiện đều thoát bình thường. Nếu một trong hai lại phát sinh lỗi __name is not a function, hãy ghi lại chính xác phiên bản Node, phiên bản tsx
(node_modules/tsx/package.json) và toàn bộ dấu vết ngăn xếp trước khi báo cáo cho dự án thượng nguồn.
Cách khắc phục tạm thời (nếu sự cố tái diễn)
-
Chạy các tập lệnh phát triển bằng Bun thay vì
node --import tsx. -
Chạy
pnpm tsgođể kiểm tra kiểu, sau đó chạy đầu ra đã dựng thay vì chạy mã nguồn thông quatsx:bash pnpm tsgonode openclaw.mjs status -
Thử một phiên bản
tsxkhác (pnpm add -D tsx@<version>là một thay đổi phụ thuộc và cần được phê duyệt theo chính sách kho mã) để khoanh vùng xem phiên bản esbuild được đóng gói kèm có gây ra lại lỗi hay không. -
Kiểm tra trên một phiên bản chính/phụ khác của Node để xác định lỗi có phụ thuộc vào phiên bản cụ thể hay không.