Diagnostics
Node + tsx ขัดข้อง
ข้อขัดข้อง Node + tsx ที่แจ้งว่า "__name is not a function"
สถานะ
แก้ไขแล้ว ข้อขัดข้องนี้ไม่สามารถทำให้เกิดซ้ำได้ใน tsx เวอร์ชันปัจจุบันที่ตรึงไว้ใน
package.json (4.22.3) หรือใน Node รุ่นปัจจุบัน เก็บข้อมูลนี้ไว้เผื่อการอัปเกรด
tsx/esbuild ในอนาคตทำให้ปัญหานี้กลับมาอีกครั้ง
อาการเดิม
การเรียกใช้สคริปต์สำหรับการพัฒนาของ OpenClaw ผ่าน tsx ล้มเหลวระหว่างเริ่มต้นระบบ โดยแสดงข้อความดังนี้:
[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)ละเว้นหมายเลขบรรทัดไว้ เนื่องจากไฟล์ทั้งสองมีการเปลี่ยนแปลงหลังจากเกิดข้อขัดข้องเดิม และบรรทัดที่ระบุในขณะนั้นไม่ตรงกันอีกต่อไป
ปัญหานี้ปรากฏขึ้นหลังจากสคริปต์สำหรับการพัฒนาเปลี่ยนจาก Bun มาใช้ tsx (2871657e,
2026-01-06) เพื่อให้ Bun เป็นตัวเลือกที่ไม่บังคับ เส้นทางการทำงานเทียบเท่าที่ใช้ Bun
ไม่เกิดข้อขัดข้อง เดิมพบปัญหานี้บน Node v25.3.0 ใน macOS และคาดว่าแพลตฟอร์มอื่น
ที่ใช้ Node 25 ก็น่าจะได้รับผลกระทบเช่นกัน
สาเหตุ
tsx แปลง TS/ESM ผ่าน esbuild โดยกำหนด keepNames: true ไว้ตายตัวใน
ตัวเลือกการแปลง การตั้งค่านี้ทำให้ esbuild ห่อการประกาศฟังก์ชัน/คลาสที่มีชื่อ
ด้วยการเรียกตัวช่วย __name เพื่อให้ fn.name ยังคงอยู่หลังการย่อขนาด
และการรวมชุดโค้ด ข้อขัดข้องนี้หมายความว่าตัวช่วยดังกล่าวหายไปหรือถูกบดบัง
ณ จุดเรียกใช้ของโมดูลนั้นในการใช้ tsx/Node รุ่นที่ได้รับผลกระทบ ส่งผลให้
__name(...) ส่งข้อผิดพลาดแทนที่จะคืนค่าที่ถูกห่อไว้
การตรวจสอบการเกิดปัญหาซ้ำในปัจจุบัน
node --versionpnpm installnode --import tsx src/entry.ts statusตัวอย่างการทำให้เกิดปัญหาซ้ำแบบแยกส่วนขั้นต่ำ (โหลดเฉพาะโมดูลจากสแต็กเทรซเดิม):
node --import tsx scripts/repro/tsx-name-repro.tsปัจจุบันทั้งสองคำสั่งสิ้นสุดการทำงานโดยไม่มีข้อผิดพลาด หากคำสั่งใดส่งข้อผิดพลาด
__name is not a function อีกครั้ง ให้บันทึกเวอร์ชัน Node ที่แน่นอน เวอร์ชัน tsx
(node_modules/tsx/package.json) และสแต็กเทรซทั้งหมดก่อนรายงานไปยังโครงการต้นทาง
วิธีแก้ขัดข้อง (หากปัญหากลับมา)
-
เรียกใช้สคริปต์สำหรับการพัฒนาด้วย Bun แทน
node --import tsx -
เรียกใช้
pnpm tsgoเพื่อตรวจสอบชนิดข้อมูล จากนั้นเรียกใช้ผลลัพธ์ที่สร้างแล้ว แทนการเรียกใช้ซอร์สโค้ดผ่านtsx:bash pnpm tsgonode openclaw.mjs status -
ลองใช้
tsxเวอร์ชันอื่น (pnpm add -D tsx@<version>เป็นการเปลี่ยนแปลง การพึ่งพาและต้องได้รับอนุมัติตามนโยบายของที่เก็บโค้ด) เพื่อไล่หาว่า esbuild เวอร์ชันที่รวมมาด้วยทำให้ข้อบกพร่องนี้กลับมาอีกครั้งหรือไม่ -
ทดสอบบน Node รุ่นหลัก/รุ่นย่อยอื่น เพื่อดูว่าความล้มเหลวนี้เกิดเฉพาะกับ บางเวอร์ชันหรือไม่