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ảntsx 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 quatsx không thể khởi động và báo lỗi:
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
__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: -
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.