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

Я пытаюсь запустить dev-сервер с TypeScript и приложением Angular без необходимости каждый раз переносить файлы ts. Я обнаружил, что могу работать с ts-node, но я также хочу смотреть .ts файлы и перезагружать приложение / сервер, как если бы я делал что-то вроде gulp watch.


person Ieltxu Algañarás    schedule 22.06.2016    source источник


Ответы (13)


РЕДАКТИРОВАТЬ: Обновлено для последней версии nodemon!

Я боролся с тем же самым в своей среде разработки, пока не заметил, что API nodemon позволяет нам изменить его поведение по умолчанию, чтобы выполнить пользовательскую команду.

Например, для последней версии nodemon:

nodemon --watch "src/**" --ext "ts,json" --ignore "src/**/*.spec.ts" --exec "ts-node src/index.ts"

Или создайте nodemon.json файл со следующим содержанием:

{
  "watch": ["src"],
  "ext": "ts,json",
  "ignore": ["src/**/*.spec.ts"],
  "exec": "ts-node ./src/index.ts"      // or "npx ts-node src/index.ts"
}

а затем запустить nodemon без аргументов.

Благодаря этому вы сможете перезагрузить ts-node процесс в реальном времени, не беспокоясь о базовой реализации.

Ваше здоровье!


И со старыми версиями nodemon:

nodemon --watch 'src/**/*.ts' --ignore 'src/**/*.spec.ts' --exec 'ts-node' src/index.ts

Или даже лучше: перенесите конфигурацию nodemon в nodemon.json файл со следующим содержимым, а затем просто запустите nodemon, как предложил Сандокан:

{
  "watch": ["src/**/*.ts"],
  "ignore": ["src/**/*.spec.ts"],
  "exec": "ts-node ./index.ts"
}
person HeberLZ    schedule 22.06.2016
comment
если index.ts - экспресс-экземпляр, как я могу его убить и перезапустить - person hjl; 23.08.2016
comment
@elaijuh теоретически эта же команда должна сделать трюк, когда nodemon настроен для выполнения пользовательской команды (в данном случае ts-node) вместо команды node по умолчанию, он будет завершать процесс и запускать новый каждый раз находит изменение в выражении часов за вычетом выражения игнорирования :) - person HeberLZ; 24.08.2016
comment
вы также можете создать файл nodemon.json со всеми упомянутыми параметрами в нем, например: { "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "exec": "ts-node ./app-server.ts" } и просто введите nodemon - person Sandokan El Cojo; 27.10.2016
comment
Я допустил ошибку, добавив ./ перед именами папок, и он сломался. У меня это сработало: { "verbose": true, "watch": ["server/**/*.ts"], "ext": "ts js json", "ignore": ["server/**/*.spec.ts"], "exec": "ts-node index.ts" }. И командная строка: nodemon --watch server/**/*.ts --ignore server/**/*.spec.ts --verbose --exec ts-node index.ts - person Adrian Moisa; 11.03.2017
comment
Я просто хотел бы упомянуть, что вы также должны установить ext в файле конфигурации, чтобы он выглядел для изменений ts. Мой файл конфигурации выглядит так: { "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "ext": "ts js json", "_exec": "node dist/startup.js", "exec": "ts-node src/startup.ts" } - person Lasse D. Slot; 28.03.2017
comment
Для пользователей Windows вам нужно будет сделать команду exec массивом для проблем с путями: "exec": "ts-node ./src/index.ts" становится = ›"exec": ["ts-node", "src/index.ts"] - person Armeen Harwood; 10.09.2017
comment
Я использую grunt-ts с nodemon, в чем разница? .. Что мне использовать grunt-ts или ts-node ..? - person danger89; 15.05.2018
comment
@HeberLZ nomdemon.json должно быть nodemon.json, я думаю - person Simon Meusel; 02.06.2018
comment
Файл nodemon.json упрощает задачу, спасибо за то, что поделился. - person darul75; 15.02.2019
comment
все еще лучшая практика? - person SuperUberDuper; 07.06.2019
comment
Я получаю (function (exports, require, module, __filename, __dirname) {import * as express from 'express'; SyntaxError: Unnexpected token * похоже, что он не принимает код es6, как я могу добавить es6? - person Pritam Bohra; 06.08.2019
comment
У меня такая же конфигурация, что и у вас, но она обновляется только тогда, когда я обновляю index.ts, а не какие-либо файлы javascript в src. - person Batman; 19.08.2019
comment
nodemon и ts-node станут очень медленными, если проект машинописного текста станет слишком большим. ts-node-dev не может перезагружаться, если ts-файл содержит только интерфейсы с изменениями. - person Ling; 17.10.2019
comment
На компьютерах с Windows НЕ используйте одинарные кавычки в файле package.json. Если заменить их на \", скрипт будет нормально работать: "nodemon --watch \"./src/**/*.ts\" -r dotenv/config --exec \"ts-node\" src/index.ts" - person TJBlackman; 11.03.2020
comment
с первой nodemon.json версией мне приходилось запускать nodemon -e ts, теперь с обновленным файлом конфигурации эта опция не требуется. - person humkins; 17.03.2020

Я отказался от nodemon и ts-node в пользу гораздо лучшей альтернативы ts-node-dev https://github.com/whitecolor/ts-node-dev

Просто запустите ts-node-dev src/index.ts

person Mikael Couzic    schedule 25.05.2018
comment
А почему так лучше? - person Deilan; 31.05.2018
comment
Это быстрее и автоматически определяет, какие файлы необходимо просмотреть, настройка не требуется. - person Mikael Couzic; 05.06.2018
comment
Это лучший (если не единственный) вариант для ts-node, особенно для крупных проектов. Он не перекомпилирует все файлы с нуля, а выполняет инкрементную компиляцию, например tsc --watch. - person Angelos Pikoulas; 11.03.2019
comment
для меня я должен добавить ts-node-dev: ts-node-dev в массив скриптов package.json, а затем выполнить npm run ts-node-dev server.ts, чтобы он работал - person bormat; 15.05.2019
comment
в моем случае это буквально в 10 раз быстрее, чем nodemon с ts-node. Спасибо! - person Florian Ludewig; 16.01.2020
comment
Так что у меня буквально есть "start": "ts-node-dev src". Нет необходимости в babel, nodemon или какой-либо другой конфигурации, которая идет с ним. Все сделано за вас. - person JMadelaine; 15.04.2020
comment
К сожалению, больше не обслуживается и перестала работать у меня. Пришлось вернуться к nodemon. - person Nikola Mihajlović; 21.04.2020
comment
Это очень быстро. Я просто добавил его следующим образом: start: ts-node-dev --respawn --transpileOnly src / index.ts - person varad11; 22.04.2020
comment
Это буквально заставило меня перезарядиться с 5-6 секунд до ~ 0,5 секунды, изменило весь мой опыт - person Mauro Insacco; 07.07.2020
comment
очень быстро и, кажется, работает очень хорошо, однако, похоже, он игнорирует все переменные среды и имеет некоторое скрытое поведение, обрабатывающее env для вас. - person Bejasc; 13.08.2020
comment
nodemon + ts-node без конфигурации работал у меня. Простая команда: nodemon src/index.ts - person Rafael Pizao; 10.09.2020
comment
fast - это преуменьшение для этого ... большое спасибо, брат ... Я так долго использовал shi ** y nodemon - person Saksham Khurana; 23.05.2021
comment
отладчик не подключается к ts-node-dev, есть ли исправление? - person Ali80; 25.05.2021
comment
Что-то не так с этим пакетом, я настоятельно рекомендую никому не скачивать его по всему миру. Когда я установил его глобально, я больше не мог запускать response native с expo. Ничего подобного не должно происходить. - person ICW; 30.06.2021
comment
ts-node-dev - хорошая идея, но у нее много проблем. Это действительно просто недостаточно надежно для реального использования. К сожалению, сопровождающий кажется недостаточно подготовленным для решения этих проблем. Вернуться к nodemon Я иду ... - person forresthopkinsa; 23.07.2021
comment
Перешел с nodemon на ts-node-dev в Windows, так как перезагрузка после изменения файла всегда приводила к сбою процесса ts-node с уже используемым портом. - person ThomasH; 29.07.2021

Вот альтернатива ответу HeberLZ с использованием сценариев npm.

My package.json:

  "scripts": {
    "watch": "nodemon -e ts -w ./src -x npm run watch:serve",
    "watch:serve": "ts-node --inspect src/index.ts"
  },
  • -e флаг устанавливает расширения для поиска,
  • -w устанавливает наблюдаемый каталог,
  • -x выполняет сценарий.

--inspect в watch:serve скрипте на самом деле является флагом node.js, он просто включает протокол отладки.

person im.pankratov    schedule 29.04.2017
comment
Также убедитесь, что для проекта локально установлен машинописный текст. В противном случае ошибка, которую вы можете получить, не очень ясна. - person Aranir; 05.07.2017
comment
Я думаю, что сейчас должно быть ts-node --inspect -- src/index.ts из-за этого. - person bluenote10; 02.04.2018
comment
Такой подход, кажется, дает значительный лишний результат. - person Freewalker; 29.06.2019
comment
-e ts -w ./src помогло мне - это сработало с проектом, сгенерированным CLI loopback4 - person Jonathan Cardoz; 06.01.2020

Это работает для меня:

nodemon src/index.ts

Очевидно, благодаря этому запросу на перенос: https://github.com/remy/nodemon/pull/1552

person DLight    schedule 07.12.2019
comment
У меня это тоже работает, но как? Кажется волшебным. Что составляет машинописный текст? У меня не установлено ts-node. - person d512; 12.12.2019
comment
@ d512 Вы уверены, что это не в вашем node_modules/? Для меня это не удастся, если у меня его нет. - person DLight; 12.12.2019
comment
Это действительно требует установки ts-node. Выполнение этой команды без ts-node приведет к failed to start process, "ts-node" exec not found ошибке. Скорее всего, это оставшийся артефакт в node_modules. При этом это решение намного приятнее, поскольку не требует дополнительной настройки. - person Brandon Clapp; 25.05.2020
comment
Установить ts-node глобально: npm install -g ts-node - person Rafael Pizao; 10.09.2020

Специально для этого вопроса я создал библиотеку tsc-watch. вы можете найти его на npm.

Очевидный вариант использования:

tsc-watch server.ts --outDir ./dist --onSuccess "node ./dist/server.js"

person gilamran    schedule 29.03.2017
comment
Как это будет работать в случае сервера express или koa, поскольку на самом деле он не уничтожает предыдущий экземпляр узла? - person brianestey; 27.11.2018
comment
'tsc-watch' убивает и перезапускает процесс за вас. - person gilamran; 28.11.2018
comment
Это именно то, что я искал. Не уверен, какова цель ts-node-dev, но мне не удалось заставить его сообщать об ошибках машинописного текста. Потратив несколько часов на то, чтобы заставить его работать, я попробовал tsc-watch, и они отлично сработали! - person Charles Naccio; 16.01.2020
comment
@gilamran в документации вашего пакета есть опечатка: "[...] similar to nodemon but for TypeCcript." :) - person Massimiliano Kraus; 28.01.2020

вы можете использовать ts-node-dev

Он перезапускает процесс целевого узла при изменении любого из требуемых файлов (как стандартный node-dev), но разделяет процесс компиляции Typescript между перезапусками.

Установить

yarn add ts-node-dev --dev

и ваш package.json может быть таким

"scripts": {
  "test": "echo \"Error: no test specified\" && exit 1",
  "tsc": "tsc",
  "dev": "ts-node-dev --respawn --transpileOnly ./src/index.ts",
  "prod": "tsc && node ./build/index.js"
}
person jsina    schedule 26.03.2019
comment
Спасибо! Это был самый простой способ включить автоматическую перезагрузку на моем сервере узлов. - person Hisham Mubarak; 12.06.2020

Добавьте "watch": "nodemon --exec ts-node -- ./src/index.ts" в scripts раздел вашего package.json.

person takasoft    schedule 13.07.2018

я сделал с

"start": "nodemon --watch 'src/**/*.ts' --ignore 'src/**/*.spec.ts' --exec ts-node src/index.ts"

и начало пряжи .. ts-node не похож на ts-node

person wayan wahyu Adi Putra    schedule 04.08.2019

добавьте это в свой файл package.json

scripts {
"dev": "nodemon --watch '**/*.ts' --exec 'ts-node' index.ts"
}

и для этого вам также необходимо установить ts-node как dev-dependency

yarn add ts-node -D

запустите yarn dev, чтобы запустить сервер разработки

person princebillyGK    schedule 12.03.2020

Я бы предпочел не использовать ts-node и всегда запускать из папки dist.

Для этого просто настройте свой package.json с конфигурацией по умолчанию:

....
"main": "dist/server.js",
  "scripts": {
    "build": "tsc",
    "prestart": "npm run build",
    "start": "node .",
    "dev": "nodemon"
  },
....

а затем добавьте файл конфигурации nodemon.json:

{
  "watch": ["src"],
  "ext": "ts",
  "ignore": ["src/**/*.spec.ts"],
  "exec": "npm restart"
}

Здесь я использую exec: npm restart
, чтобы весь ts-файл перекомпилировался в js-файл, а затем перезапустил сервер.

Чтобы запустить в среде разработки,

npm run dev

Используя эту настройку, я всегда буду работать с распределенными файлами и мне не понадобится ts-node.

person Raja P.B.    schedule 02.07.2020

Другой способ - сначала скомпилировать код в режиме просмотра с tsc -w, а затем использовать nodemon поверх javascript. Этот метод аналогичен по скорости ts-node-dev и имеет то преимущество, что он больше похож на производственный.

 "scripts": {
    "watch": "tsc -w",
    "dev": "nodemon dist/index.js"
  },
person Miguel Ángel Torres    schedule 18.10.2020
comment
Или просто "dev": "( tsc -w & ) && nodemon dist/index.js". - person Craig Hicks; 20.05.2021

Если у вас возникают проблемы при использовании "type": "module" в package.json (описано в https://github.com/TypeStrong/ts-node/issues/1007) используйте следующую конфигурацию:

{
  "watch": ["src"],
  "ext": "ts,json",
  "ignore": ["src/**/*.spec.ts"],
  "exec": "node --loader ts-node/esm --experimental-specifier-resolution ./src/index.ts"
}

или в командной строке

nodemon --watch "src/**" --ext "ts,json" --ignore "src/**/*.spec.ts" --exec "node --loader ts-node/esm --experimental-specifier-resolution src/index.ts"
person fernandopasik    schedule 05.01.2021

ШАГ 1. Вы можете просто установить nodemon и ts-node (пропустить, если вы уже сделали)

npm install --save-dev nodemon ts-node

ШАГ 2. Вы можете настроить стартовый скрипт в package.json.

"start": "nodemon ./src/app.ts"

Теперь nodemon автоматически идентифицирует машинописный текст из проекта и сам использует команду ts-node. Используйте npm start, и он автоматически компилируется / просматривается и перезагружается.

Если вы получаете какие-либо ошибки, например, модуль машинописного текста не найден в проекте. просто используйте эту команду в папке проекта.

npm link typescript
person J. MARS    schedule 13.07.2021