Збій Node + tsx “__name is not a function”
Підсумок
Запуск OpenClaw через Node зtsx завершується помилкою під час старту:
tsx (коміт 2871657e, 2026-01-06). Той самий шлях виконання раніше працював із Bun.
Середовище
- Node: v25.x (спостерігалося на v25.3.0)
- tsx: 4.21.0
- ОС: macOS (відтворення також імовірне на інших платформах, де запускається Node 25)
Відтворення (лише Node)
Мінімальне відтворення в репозиторії
Перевірка версії Node
- Node 25.3.0: помилка
- Node 22.22.0 (Homebrew
node@22): помилка - Node 24: тут ще не встановлено; потрібна перевірка
Нотатки / гіпотеза
tsxвикористовує esbuild для трансформації TS/ESM.keepNamesв esbuild створює допоміжний елемент__nameі обгортає визначення функцій у__name(...).- Збій означає, що
__nameіснує, але не є функцією під час виконання, а це вказує на те, що допоміжний елемент відсутній або перезаписаний для цього модуля в шляху завантажувача Node 25. - Про схожі проблеми з допоміжним елементом
__nameуже повідомляли в інших споживачів esbuild, коли цей допоміжний елемент відсутній або переписаний.
Історія регресії
2871657e(2026-01-06): скрипти змінено з Bun на tsx, щоб зробити Bun необов’язковим.- До цього (шлях Bun)
openclaw statusіgateway:watchпрацювали.
Обхідні шляхи
- Використовувати Bun для dev-скриптів (поточне тимчасове повернення).
-
Використовувати
tsgoдля перевірки типів у репозиторії, а потім запускати зібраний вивід: -
Історична примітка:
tscтут використовувався під час налагодження цієї проблеми Node/tsx, але тепер у репозиторії для перевірки типів використовуються шляхиtsgo. -
Вимкнути esbuild
keepNamesу TS-завантажувачі, якщо це можливо (це запобігає вставці допоміжного елемента__name); наразі tsx не надає такого параметра. -
Перевірити Node LTS (22/24) із
tsx, щоб з’ясувати, чи проблема специфічна для Node 25.
Посилання
- https://opennext.js.org/cloudflare/howtos/keep_names
- https://esbuild.github.io/api/#keep-names
- https://github.com/evanw/esbuild/issues/1031
Наступні кроки
- Відтворити на Node 22/24, щоб підтвердити регресію Node 25.
- Перевірити
tsxnightly або зафіксувати попередню версію, якщо відома регресія справді існує. - Якщо проблема відтворюється на Node LTS, створити мінімальне відтворення upstream із трасуванням стека
__name.