Diagnostics
خرابی Node + tsx
از کار افتادن Node + tsx با خطای «__name تابع نیست»
وضعیت
رفع شده است. این ازکارافتادگی در نسخهٔ کنونی 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 آزمایش کنید تا مشخص شود آیا خرابی مختص نسخه است.