Diagnostics

Node + tsx ขัดข้อง

ข้อขัดข้อง Node + tsx ที่แจ้งว่า "__name is not a function"

สถานะ

แก้ไขแล้ว ข้อขัดข้องนี้ไม่สามารถทำให้เกิดซ้ำได้ใน tsx เวอร์ชันปัจจุบันที่ตรึงไว้ใน package.json (4.22.3) หรือใน Node รุ่นปัจจุบัน เก็บข้อมูลนี้ไว้เผื่อการอัปเกรด tsx/esbuild ในอนาคตทำให้ปัญหานี้กลับมาอีกครั้ง

อาการเดิม

การเรียกใช้สคริปต์สำหรับการพัฒนาของ OpenClaw ผ่าน tsx ล้มเหลวระหว่างเริ่มต้นระบบ โดยแสดงข้อความดังนี้:

text
[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(...) ส่งข้อผิดพลาดแทนที่จะคืนค่าที่ถูกห่อไว้

การตรวจสอบการเกิดปัญหาซ้ำในปัจจุบัน

bash
node --versionpnpm installnode --import tsx src/entry.ts status

ตัวอย่างการทำให้เกิดปัญหาซ้ำแบบแยกส่วนขั้นต่ำ (โหลดเฉพาะโมดูลจากสแต็กเทรซเดิม):

bash
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 รุ่นหลัก/รุ่นย่อยอื่น เพื่อดูว่าความล้มเหลวนี้เกิดเฉพาะกับ บางเวอร์ชันหรือไม่

เอกสารอ้างอิง

เนื้อหาที่เกี่ยวข้อง

Was this useful?
On this page

On this page