Аварійне завершення Node + tsx з помилкою “__name is not a function”
Стан
Вирішено. Це аварійне завершення не відтворюється з поточною версієюtsx, зафіксованою в
package.json (4.22.3), або з поточними випусками Node. Цю сторінку збережено на випадок, якщо
майбутнє оновлення tsx/esbuild знову спричинить проблему.
Початковий симптом
Запуск сценаріїв розробки OpenClaw черезtsx завершувався помилкою під час запуску:
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(...)
викидала помилку замість повернення обгорнутого значення.
Поточна перевірка відтворення
__name is not a function, перед надсиланням звіту до upstream-проєкту збережіть точну версію Node, версію tsx
(node_modules/tsx/package.json) і повне трасування стека.
Обхідні шляхи (якщо аварійне завершення повернеться)
-
Запускайте сценарії розробки за допомогою Bun замість
node --import tsx. -
Запустіть
pnpm tsgoдля перевірки типів, а потім запускайте зібраний результат замість вихідного коду черезtsx: -
Спробуйте іншу версію
tsx(pnpm add -D tsx@<version>змінює залежності й відповідно до політики репозиторію потребує схвалення), щоб методом поділу діапазону визначити, чи версія esbuild у її складі знову спричинила цю помилку. - Перевірте з іншою основною або додатковою версією Node, щоб з’ясувати, чи залежить помилка від версії.