tsx и ts-node

Тема дорожной карты · Node.js

tsx и ts-node — это npm-инструменты, позволяющие запускать TypeScript-файлы непосредственно в среде выполнения Node.js без отдельного шага компиляции, что значительно улучшает опыт разработчика при серверной разработке, устраняя необходимость в ручном цикле tsc && node dist/. ts-node было изначальным решением, транспилирующим TypeScript «на лету» с помощью API компилятора TypeScript, однако его производительность в крупных проектах привела к появлению tsx, использующего esbuild внутри для почти мгновенной транспиляции TypeScript с гораздо более быстрым временем запуска. Запуск tsx src/index.ts или ts-node src/index.ts заставляет Node.js трактовать файлы .ts как исполняемые, что идеально подходит для скриптов разработки, CLI-инструментов, скриптов миграции базы данных, запускаемых через npx prisma migrate, и тест-раннеров, которым требуется поддержка TypeScript. В скриптах package.json запись "dev": "tsx watch src/index.ts" обеспечивает разработческий сервер Node.js TypeScript-приложений с горячей перезагрузкой, автоматически перезапускающийся при изменении файлов. tsx и ts-node — строго инструменты разработки; продакшн-развёртывания Node.js всегда должны запускать предварительно скомпилированный JavaScript из dist/, а не транспилировать TypeScript во время выполнения, поскольку накладные расходы на компиляцию и отсутствие проверки типов во время выполнения делают прямое выполнение непригодным для производительно-чувствительных серверных сервисов.

Как это работает

tsx и ts-node добавляет статическую типизацию к JavaScript через TypeScript-компилятор (tsc) или runtime-трансформеры (tsx, ts-node, swc, esbuild). tsconfig.json контролирует строгость; strict: true — современный дефолт, ловит много багов на сборке. Type-декларации для npm-пакетов — из пакета или DefinitelyTyped (@types/*). Современные проекты компилируют через SWC/esbuild для скорости, типы проверяют отдельно tsc --noEmit в CI.

Когда применять

TypeScript — в каждый новый Node-проект: кривая обучения маленькая, выигрыш большой (ловит опечатки, безопасные рефакторы, IDE-автокомплит). Даже однофайловые скрипты выигрывают. Тонкий runtime-трансформер (tsx) в dev для мгновенного фидбека; реальная проверка типов (tsc --noEmit) — в CI. Избегайте any и @ts-ignore — это против смысла.

Типичные ошибки

Ловушки tsx и ts-node: уход в any когда типы мешают (рефакторьте, не кастуйте); tsc для компиляции в CI (медленно — отдавайте swc/esbuild, tsc — только проверка типов); расходящиеся runtime + type-check пайплайны пропускают ошибки; забыли обновить @types/node вместе с major Node; гонка за strict: false "чтобы быстрее" (баги вернутся позже).

Связанные понятия

Полезные ресурсы