Diagnostics

Сбой Node + tsx

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

Статус

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

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

Запуск сценариев разработки OpenClaw через tsx завершался ошибкой при запуске:

text
[openclaw] Не удалось запустить CLI: TypeError: __name не является функцией    в createSubsystemLogger (src/logging/subsystem.ts)    в <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