Як дивитися та перезавантажувати ts-вузол при зміні файлів TypeScript


192

Я намагаюся запустити сервер розробників з 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файл у конфігурації, так що його погляд на ts змінюється. Мій файл конфігурації виглядає так:{ "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-вузла, особливо для великих проектів. Він не перекомпілює всі файли з нуля, але робить поступову компіляцію, як tsc --watch.
Анжелос Пікулас

3
в моєму випадку це буквально в 10 разів швидше, ніж nodemonз ts-node. Дякую!
Флоріан

3
Тому я буквально просто маю "start": "ts-node-dev src". Немає потреби в бабелі, нодемоні чи будь-якому з конфігурацій, які постачаються разом із цим. Все справляється за вас.
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,
Jonathan Cardoz

16

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

Очевидним випадком використання буде:

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


Як це буде працювати у випадку сервера Express або koa, оскільки він фактично не знищує попередній екземпляр вузла?
brianestey

'tsc-watch' вбиває і відновлює процес для вас.
gilamran

Це саме те, що я шукав. Не впевнений, яка мета ts-node-dev, але я не зміг змусити його повідомити про помилки машинопису. Провівши години, намагаючись змусити його працювати, я спробував годинник, і він спрацював як шарм!
Чарльз Наччо

@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. Однак, це рішення набагато приємніше, оскільки не потребує додаткової конфігурації.
Брендон Клапп


7

ви можете використовувати ts-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"
}

Дякую! Це було найпростішим способом, який я знайшов, щоб увімкнути автоматичне перезавантаження з мого сервера вузлів.
Хішам Мубарак

7

я робив з

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

і запуск пряжі .. ts-вузол не схожий на 'ts-вузол'


1

Я вважаю за краще не використовувати ts-вузол, а завжди працювати з папки dist.

Для цього просто встановіть пакет.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-вузла.


0

додайте це у файл package.json

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

і щоб зробити цю роботу вам також потрібно встановити ts-вузол як залежність від розробок

yarn add ts-node -D

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.