Как автоматически перезапускать ts-node при изменении TypeScript файлов (watch & reload)
Решение: nodemon + ts-node (классический подход)
Проблема в том, что nodemon по умолчанию не умеет работать с TypeScript. Ему нужно явно указать, что запускать ts-node, а также настроить наблюдение за .ts файлами. Вот полное решение:
1. Установка зависимостей
npm install --save-dev nodemon ts-node
Важно: ts-node должен быть установлен локально в проекте (не глобально), чтобы nodemon мог его найти.
2. Настройка package.json
Добавьте в scripts следующую команду:
{
"scripts": {
"dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts",
"start": "ts-node src/server.ts"
}
}
Объяснение параметров:
--watch 'src/**/*.ts'— отслеживать все.tsфайлы в папкеsrc(рекурсивно).--exec 'ts-node'— использоватьts-nodeдля выполнения файла.src/server.ts— точка входа вашего приложения.
3. Альтернатива: nodemon.json конфиг
Создайте файл nodemon.json в корне проекта:
{
"watch": ["src"],
"ext": "ts",
"exec": "ts-node src/server.ts"
}
Тогда в package.json достаточно написать:
"scripts": {
"dev": "nodemon"
}
4. Продвинутый вариант: ts-node-dev (рекомендуется)
ts-node-dev — это специализированный инструмент, который работает быстрее, так как переиспользует процесс компиляции TypeScript.
npm install --save-dev ts-node-dev
В package.json:
"scripts": {
"dev": "ts-node-dev --respawn --transpile-only src/server.ts"
}
Параметры:
--respawn— перезапускать при изменениях (аналог watch).--transpile-only— только транспиляция (без проверки типов), что ускоряет перезапуск.
5. Пример рабочего проекта
Файловая структура:
my-project/
├── src/
│ ├── server.ts
│ └── routes/
│ └── index.ts
├── package.json
├── tsconfig.json
└── nodemon.json (опционально)
tsconfig.json (минимальная конфигурация):
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true
},
"include": ["src/**/*"],
"exclude": ["node_modules"]
}
6. Частые проблемы и их решение
- Ошибка "ts-node: command not found" — установите
ts-nodeлокально:npm install ts-node --save-dev. - nodemon не видит изменения — проверьте пути в
--watchилиwatchв конфиге. - Медленные перезапуски — используйте
ts-node-devс флагом--transpile-only. - Проблемы с модулями ES — добавьте
"type": "module"вpackage.jsonи используйтеts-node --esm.
Заключение
Для простых проектов подойдет связка nodemon + ts-node. Для более быстрой разработки используйте ts-node-dev. Оба решения автоматически перезапускают сервер при изменении .ts файлов, что значительно ускоряет разработку.
Альтернативный подход: использование tsx (TypeScript Execute)
Современная альтернатива ts-node — пакет tsx (TypeScript Execute). Он работает быстрее и проще в настройке, так как использует esbuild для транспиляции.
Установка и настройка
npm install --save-dev tsx
В package.json:
"scripts": {
"dev": "tsx watch src/server.ts"
}
Команда tsx watch автоматически отслеживает изменения .ts файлов в проекте и перезапускает сервер. Не нужно дополнительно устанавливать nodemon или настраивать конфиги.
Преимущества tsx
- Мгновенная транспиляция (использует esbuild).
- Встроенный watch-режим.
- Поддержка ES-модулей и CommonJS без дополнительных настроек.
- Не требует
tsconfig.jsonдля базовой работы.
Пример
Если ваш server.ts использует ES-модули (import), tsx работает с ними "из коробки". Просто запустите:
npm run dev
При изменении любого .ts файла в проекте сервер автоматически перезапустится.
Недостаток: tsx не проверяет типы (только транспиляция). Для проверки типов используйте отдельно tsc --noEmit в CI/CD.