Skip to main content

Сбой Node + tsx «__name is not a function»

Статус

Устранено. Этот сбой не воспроизводится на текущей версии tsx, зафиксированной в package.json (4.22.3), или в текущих выпусках Node. Эта информация сохранена на случай, если будущее обновление tsx/esbuild вновь вызовет проблему.

Исходный симптом

Запуск сценариев разработки OpenClaw через tsx завершался ошибкой при запуске:
Номера строк опущены: оба файла изменились с момента первоначального сбоя, и конкретные строки больше не совпадают. Проблема появилась после того, как сценарии разработки перешли с 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(...) выдавала исключение вместо возврата обёрнутого значения.

Текущая проверка воспроизведения

Минимальный изолированный пример воспроизведения (загружает только модуль из исходной трассировки стека):
Обе команды сейчас завершаются без ошибок. Если какая-либо из них снова выдаст __name is not a function, перед отправкой отчёта в вышестоящий проект зафиксируйте точную версию Node, версию tsx (node_modules/tsx/package.json) и полную трассировку стека.

Обходные решения (если сбой вернётся)

  • Запускайте сценарии разработки с Bun вместо node --import tsx.
  • Запустите pnpm tsgo для проверки типов, а затем запускайте собранный результат вместо исходного кода через tsx:
  • Попробуйте другую версию tsx (pnpm add -D tsx@<version> является изменением зависимости и требует одобрения согласно политике репозитория), чтобы методом бисекции определить, не вернула ли ошибку включённая в неё версия esbuild.
  • Проверьте работу с другой основной или дополнительной версией Node, чтобы выяснить, зависит ли сбой от версии.

Ссылки

См. также