Avatar ·

Как настроить автоматическую перезагрузку ts-node при изменении TypeScript файлов

Всем привет! Я начинающий TypeScript разработчик и столкнулся с проблемой при разработке серверного приложения на Node.js. У меня есть проект на TypeScript, который я запускаю с помощью `ts-node`. Вот как выглядит мой файл `package.json`: ```json { "scripts": { "start": "ts-node src/index.ts" } } ``` Каждый раз, когда я вношу изменения в файлы `.ts`, мне приходится вручную останавливать процесс (Ctrl+C) и запускать его снова. Это очень неудобно и замедляет разработку. Я слышал про `nodemon`, но не понимаю, как правильно его настроить для работы с TypeScript. Пробовал установить `nodemon` и запускать так: ```bash nodemon --exec ts-node src/index.ts ``` Но после изменения файла, nodemon перезапускает процесс, но изменения не применяются, или появляются странные ошибки. Иногда nodemon просто не видит изменений в `.ts` файлах. Подскажите, пожалуйста, как правильно настроить автоматическую перезагрузку при разработке на TypeScript с использованием `ts-node` и `nodemon`? Какие флаги нужно добавить? Может есть более современные альтернативы? Буду благодарен за подробное объяснение с примерами конфигурации! <<>>

Правильная настройка автоматической перезагрузки 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, который компилирует "на лету". Однако он более надёжен для продакшен-подобных сред.