Avatar ·

Как автоматически перезапускать ts-node при изменении TypeScript файлов (watch & reload)

Всем привет! Я начинающий разработчик на TypeScript и столкнулся с проблемой, которая сильно замедляет мою разработку. Я пишу бэкенд на Express с TypeScript. Каждый раз, когда я вношу изменения в код (например, в файл `server.ts`), мне нужно вручную остановить процесс (`Ctrl+C`) и снова запустить `ts-node server.ts`. Это очень неудобно, особенно когда нужно быстро тестировать изменения. Вот пример моего проекта: ```typescript // server.ts import express from 'express'; const app = express(); const PORT = 3000; app.get('/', (req, res) => { res.send('Hello, World!'); }); app.listen(PORT, () => { console.log(`Server running on http://localhost:${PORT}`); }); ``` Я слышал про инструменты вроде `nodemon`, которые автоматически перезапускают сервер при изменении файлов. Но когда я пытаюсь запустить `nodemon ts-node server.ts`, у меня ничего не работает — либо nodemon не видит изменений, либо выдает ошибки. Подскажите, пожалуйста, как правильно настроить автоматический рестарт (watch & reload) для ts-node? Какие есть лучшие практики? Нужно ли устанавливать какие-то дополнительные пакеты? Буду благодарен за подробный пример конфигурации. <<>>

Решение: 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.