Как настроить автоматическую перезагрузку ts-node при изменении TypeScript файлов
Правильная настройка автоматической перезагрузки TypeScript с ts-node и nodemon
Проблема, с которой вы столкнулись, очень распространена среди TypeScript-разработчиков. Дело в том, что nodemon по умолчанию следит за изменениями в файлах с расширениями .js, .json и .html, но не следит за .ts файлами. Поэтому даже если вы меняете TypeScript-файлы, nodemon не видит изменений и не перезапускает процесс.
Вот правильная конфигурация, которая решит вашу проблему:
Способ 1: Использование nodemon.json (рекомендуется)
Создайте в корне проекта файл nodemon.json со следующим содержимым:
{
"watch": ["src"],
"ext": "ts,json",
"ignore": ["src/**/*.spec.ts"],
"exec": "ts-node src/index.ts"
}
Затем обновите package.json:
{
"scripts": {
"dev": "nodemon"
}
}
Теперь запускайте проект командой npm run dev. Nodemon будет следить за всеми .ts и .json файлами в папке src и перезапускать ts-node при их изменении.
Способ 2: Использование флагов в package.json
Если вы не хотите создавать отдельный конфигурационный файл, можно передать все параметры через команду:
{
"scripts": {
"dev": "nodemon --watch src --ext ts,json --exec ts-node src/index.ts"
}
}
- --watch src — указывает директорию для отслеживания
- --ext ts,json — расширения файлов, за которыми нужно следить
- --exec ts-node src/index.ts — команда для выполнения
Способ 3: Использование ts-node-dev (более быстрая альтернатива)
ts-node-dev — это специализированная утилита, которая работает быстрее, чем связка nodemon + ts-node, так как использует переиспользование процессов.
Установите её:
npm install --save-dev ts-node-dev
Добавьте скрипт в package.json:
{
"scripts": {
"dev": "ts-node-dev --respawn --transpile-only src/index.ts"
}
}
- --respawn — автоматический перезапуск при изменениях
- --transpile-only — отключает проверку типов для ускорения (рекомендуется для разработки)
Важные замечания
Если вы используете ts-node с флагом --transpile-only, это может ускорить запуск, но отключает проверку типов. Для разработки это обычно приемлемо, но для продакшена лучше использовать полную компиляцию.
Также убедитесь, что в вашем tsconfig.json настроена правильная компиляция. Минимальная конфигурация для серверного проекта:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true
}
}
Теперь ваша среда разработки будет автоматически перезагружаться при любых изменениях в TypeScript-файлах, что значительно ускорит процесс разработки!
<<Альтернативный подход: Использование встроенного watch режима TypeScript
Если вы предпочитаете минималистичное решение без дополнительных зависимостей, можно использовать встроенный режим наблюдения TypeScript вместе с concurrently.
Установите пакет:
npm install --save-dev concurrently
Настройте package.json:
{
"scripts": {
"build:watch": "tsc --watch",
"start:watch": "nodemon --watch dist --ext js dist/index.js",
"dev": "concurrently \"npm run build:watch\" \"npm run start:watch\""
}
}
Этот подход разделяет компиляцию и запуск: TypeScript компилирует файлы в папку dist при каждом изменении, а nodemon следит за изменениями в dist и перезапускает скомпилированный JavaScript. Такой метод даёт больше контроля и может быть полезен, если вы хотите точно видеть, что именно компилируется.
Недостаток: Этот подход медленнее, так как включает полную компиляцию TypeScript, в отличие от ts-node, который компилирует "на лету". Однако он более надёжен для продакшен-подобных сред.