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


192

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

Ответы:


404

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

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" }

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

Ура!

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

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

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

Если index.tsэто экспресс-экземпляр, как я могу убить его и перезапустить
hjl

@elaijuh в теории эта же команда должна сделать свое дело, когда nodemon настроен на выполнение пользовательской команды (в данном случае ts-node) вместо команды узла по умолчанию, он будет завершать процесс и запускать новую каждый раз, когда она находит изменение в часовом выражении минус выражение игнорирования :)
HeberLZ

15
Вы также можете создать файл nodemon.json со всеми упомянутыми в нем параметрами, например, так: { "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "exec": "ts-node ./app-server.ts" }просто введитеnodemon
Sandokan El Cojo

3
Я сделал ошибку, добавив ./перед именами папок, и она сломалась. Это сработало для меня { "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
Адриан Мойса

2
Я просто хотел бы упомянуть, что вы также должны установить extв файле конфигурации, так что его поиск изменений. Мой конфигурационный файл выглядит так:{ "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "ext": "ts js json", "_exec": "node dist/startup.js", "exec": "ts-node src/startup.ts" }
Lasse D. Slot

114

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

Просто беги ts-node-dev src/index.ts


6
И почему это лучше?
Дейлан

22
Это быстрее и автоматически определяет, какие файлы нужно просмотреть, без необходимости настройки.
Микаэль Кузик

4
Это лучший (если не единственный) вариант для ts-node, особенно для крупных проектов. Он не перекомпилирует все файлы с нуля, но выполняет пошаговую компиляцию, например tsc --watch.
Ангелос Пикулас

3
в моем случае это буквально в 10 раз быстрее чем nodemonс ts-node. Спасибо!
Флориан

3
Так что я буквально просто так "start": "ts-node-dev src". Нет необходимости в babel, nodemon или любой другой конфигурации, которая идет с ним. Все обрабатывается для вас.
JMadelaine

53

Вот альтернатива в HeberLZ в ответ , используя НПМ скрипты.

Мой 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, он просто включает протокол отладки.


2
Также убедитесь, что для проекта установлена ​​локальная машинопись. В противном случае ошибка, которую вы можете получить, не очень ясна.
Аранир

Я думаю, что это должно быть ts-node --inspect -- src/index.tsсейчас из-за этого .
bluenote10

1
Этот подход, кажется, генерирует значительную избыточную продукцию.
Freewalker

-e ts -w ./srcсделал свое дело для меня - это работало с созданным CLI-проектом loopback4
Джонатан Кардос

16

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

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

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


Как это будет работать в случае сервера экспресс или koa, поскольку он фактически не уничтожает предыдущий экземпляр узла?
Брианестей

«TSC-Watch» убивает и перезапускает процесс для вас.
Гиламран

Это именно то, что я искал. Не уверен, какова цель ts-node-dev, но я не смог заставить его сообщать об ошибках машинописи. Потратив несколько часов, пытаясь заставить его работать, я попробовал tsc-watch, и это сработало как шарм!
Чарльз Начио

@gilamran в документации вашего пакета есть опечатка: "[...] similar to nodemon but for TypeCcript.":)
Массимилиано Краус

13

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

nodemon src/index.ts

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


У меня это тоже работает, но как? Кажется волшебным. Что компилирует машинопись? Я не ts-nodeустановил.
d512

1
@ d512 Ты уверен, что это не в твоем node_modules/? Для меня это не удастся, если у меня его нет.
DLight

1
Это действительно требует ts-nodeустановки. Выполнение этой команды без ts-nodeприведет к failed to start process, "ts-node" exec not foundошибке. Вы, вероятно, имели это как оставшийся артефакт в node_modules. При этом, это решение намного приятнее, так как не требует дополнительной настройки.
Брэндон Клэп

12

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


7

Вы могли бы использовать ts-node-dev

Он перезапускает процесс целевого узла при изменении любого из необходимых файлов (как стандартного узла-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"
}

Спасибо! Это был самый простой способ включить автоматическую перезагрузку на моем сервере узлов.
Хишам Мубарак


1

Я бы предпочел не использовать 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.


0

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

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

и чтобы это работало, вам также нужно установить ts-node как dev-зависимость

yarn add ts-node -D

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.