Есть ли способ использовать сценарии npm для запуска tsc -watch && nodemon --watch?

Я ищу способ использовать сценарии npm для одновременного запуска tsc --watch && nodemon --watch. Я могу запускать эти команды независимо, но когда я хочу запустить их обе, выполняется только первая. например. если у меня есть этот скрипт:

"scripts": {    
    "runDeb": "set NODE_ENV=development&& tsc --watch && nodemon --watch"
  }

tsc --watch выполняется, но nodemon никогда не вызывается, и наоборот.


person Nicolas Dominguez    schedule 08.07.2016    source источник


Ответы (8)


Я думаю, что вы хотите что-то вроде этого (моя текущая установка):

"scripts": {
    "compile": "tsc && node app.js",
    "dev": "./node_modules/nodemon/bin/nodemon.js -e ts  --exec \"npm run compile\""
}

Я создал два скрипта "compile" и "dev". Чтобы начать разработку, вы просто запускаете npm run dev, который запускает nodemon и заставляет его просматривать файлы .ts (используя флаг -e). Затем каждый раз, когда файл .ts изменяется, nodemon будет exec выполнять задачу компиляции, которая в основном компилирует и запускает приложение node.

Хотя использование одновременного выполнения является хорошим вариантом, моя установка гарантирует, что работа tsc будет выполнена до того, как будет выполнена попытка выполнить полученные файлы .js.

person AlterX    schedule 17.10.2016
comment
Обязательно установите "watch": false в файле tsconfig.json. В противном случае node app.js никогда не запустится. - person Matt; 22.11.2016
comment
Да, но tsc не будет просматривать файлы, если вы не скажете ему об этом, используя либо -w/--watch, либо, как вы упомянули "watch": true в tsconfig.json, так что вполне можно использовать эту технику. - person AlterX; 25.11.2016
comment
любой способ заставить это работать с экспресс 4? Я продолжаю получать чистый выход [nodemon] после его запуска. - person APalmer; 27.04.2017
comment
Хм, экспресс-версия должна иметь какое-то отношение к этому. Это просто запустит все, что находится в файле app.js. Я использовал эту технику с Express 4 и Koa. У вас есть где-нибудь ваш код? - person AlterX; 04.05.2017
comment
tsc -w использует инкрементную компиляцию и кеширование для уже проанализированных файлов, поэтому компиляция должна выполняться быстрее, поэтому я предпочитаю одновременно запускать tsc -w с nodemon - person Andzej Maciusovic; 10.05.2017
comment
Если вы используете одновременно, он одновременно запускает обе задачи, проблема с этим, как указано в другом ответе, заключается в том, что nodemon запускается до завершения компиляции tsc, поэтому он не обслуживает последние изменения. См. комментарий Николя Домингеса. - person AlterX; 10.05.2017
comment
Отличный трюк! Спасибо @AlterX. Всем читателям: если ваши файлы TypeScript находятся во вложенной папке (например, src), вам необходимо выполнить следующее: nodemon --watch src/ --exec \"npm run compile\" --verbose -e ts. - person Benny Neugebauer; 04.02.2018
comment
Эта установка сработала для меня! Также не было stackoverflow.com/a/38695935/1942263 проблемы запуска nodemon до завершения сборки tsc. - person Alexander; 02.05.2018
comment
Лучше: "start": "nodemon -w src --exec 'npm run compile'" 1. Путь к nodemon не нужен. 2. Пришлось добавить путь для просмотра (-w src), иначе он постоянно перестраивается, потому что цель (здесь dist) тоже просматривается. Просто сначала добавьте nodemon к devDependencies: npm i -D nodemon - person Marc Wäckerlin; 07.07.2021

Я уже некоторое время использую решение AlterX, и оно отлично работает, но я обнаружил, что оно довольно медленное. Вместо этого я теперь использую tsc-watch. Это заставляет tsc использовать инкрементную компиляцию, аналогичную флагу -w, что значительно ускоряет перезапуск приложения.

Это так же просто, как поместить что-то подобное в ваш package.json:

"scripts": {
  "start": "./node_modules/.bin/tsc-watch --onSuccess \"node .\""
}
person Borre Mosch    schedule 15.11.2017
comment
Это отличное решение! Я смог связать несколько команд в обратном вызове следующим образом: --onSuccess "sh -c 'babel && uglifyjs'" - person Adam Mazzarella; 03.01.2018
comment
После того, как я установил tsc-watch, при запуске скрипта я получаю эту ошибку: sh: tsc-watch: команда не найдена. - person overcomer; 09.11.2018
comment
Вы уверены, что установили tsc-watch в свой проект? Вы можете попробовать использовать ./node_modules/.bin/tsc-watch вместо tsc-watch - person Borre Mosch; 09.11.2018
comment
@Borre, Действительно странно: повторил установку и теперь корректно устанавливается. Но для этого нужно, чтобы tsc был установлен локально. После этого работает нормально. - person overcomer; 09.11.2018
comment
Лучше принятого ответа (если важна скорость) - person jugglingcats; 28.06.2019
comment
Этот пост только что положил конец моей 3,5-дневной охоте за исправлением моих конвейеров gulp-typescript и gulp-sourcemap. Если бы я только нашел это раньше... Для следующего читателя: отладчик vscode может быть присоединен к этому, если вы выполните node --inspect . и добавите простую задачу для присоединения. Еще одно замечание: может быть удобно установить notify-send на свой компьютер с apt и использовать его для отправки системных уведомлений о событии --onFailure. - person MagicLegend; 19.03.2020
comment
Лучший ответ, P.S. вам не нужно указывать путь к модулю в скрипте npm, это работает нормально - "tsc-watch --onSuccess \"node dist/index.js\"" - person Dominic; 22.06.2020
comment
на случай, если кто-то ищет, как запустить другой скрипт npm: "watch": "tsc-watch --onFirstSuccess \"npm run inspect\"", - person GorvGoyl; 21.05.2021

Попробуйте добавить это в ваш package.json:

"scripts": {
  "start": "concurrently --kill-others \"tsc -w\" \"nodemon dist/app.js\"",
}

А также добавьте эти пакеты npm (одновременно, nodemon, typescript) в ваш package.json:

"devDependencies": {
  "concurrently": "^2.2.0",
  "typescript": "^1.8.10",
  "nodemon": "^1.9.2",
}
person Alexander Sergeev    schedule 01.08.2016
comment
Единственная проблема заключается в том, что nodemon запускается до того, как машинописный текст закончит свою работу, одно хакерское решение может установить задержку для nodemon, например nodemon --delay x, это дает некоторые моменты для tsc. - person Nicolas Dominguez; 14.08.2016
comment
@NicolasDominguez, посмотрите мой ответ, чтобы узнать, как гарантировать, что изменения tsc будут выполнены до запуска приложения. - person AlterX; 29.11.2016
comment
@AlterX Да, но разве tsc --watch не более эффективно? - person Alex Booker; 28.05.2017
comment
@AlexBooker, вероятно, это так, но это не работает для этого конкретного случая использования, поскольку мы не можем гарантировать, что tsc будет выполнено перед запуском. На практике это означает, что вы не можете гарантировать, что последние изменения будут включены в код, который nodemon работает, и в этом весь смысл наблюдения за изменениями в первую очередь. Чтобы было ясно, если вы используете одновременно, обе задачи будут выполняться одновременно, что означает, что вы будете запускать и tsc, и nodemon одновременно, и, поскольку tsc требует некоторого времени для компиляции, скорее всего, nodemon не будет выберите последние изменения, так как они начнутся до окончания tsc. - person AlterX; 29.05.2017
comment
@AlterX Мое решение — использовать tsc-watch: tsc-watch --onSuccess \"node ./bin\". Что вы думаете? - person Alex Booker; 30.05.2017
comment
Да, кажется, здесь решается наша основная проблема: запуск нового процесса после завершения компиляции. Он был опубликован пару месяцев назад, так что не думаю о стабильности, но похоже, что это еще одно хорошее решение проблемы. - person AlterX; 31.05.2017
comment
@AlexBooker не хотите опубликовать это как ответ? tsc-watch отлично сработало для меня. - person Arjan; 17.07.2017
comment
tsc-watch прекрасно работает; в моем скрипте package.json dev: "tsc-watch --onSuccess \"nodemon\"" - person Leo; 29.11.2018

В чем дело

Проблема в том, что здесь есть два наблюдателя за всеми файлами. Один tsc -w, другой nodemon.

Когда в файл .ts вносятся изменения, tsc обнаруживает это, компилирует его и создает версию .js в папке назначения.

Теперь, с точки зрения Nodemon, он обнаруживает два изменения (как минимум) — одно для .ts и одно для .js. При первом изменении он перезапускается сам, но при втором изменении он не знает, что уже происходит другой запуск, поэтому он пытается перезапуститься снова, но терпит неудачу. Для меня это ошибка nodemon — см. https://github.com/remy/nodemon/issues/ 763.

Решения

1) Используйте tsc-watch --onSuccess

tsc-watch имеет --onSuccess, на который вы можете поставить node. Таким образом, у вас будет только один наблюдатель.

2) Задержка узла

Вы можете легко отложить перезапуск nodemon (см. --delay). Это требует наименьших изменений в настройке.

3) Пусть nodemon только отслеживает папку назначения TSC

Мне не удалось его настроить, но, надеюсь, таким образом nodemon обнаружит только одно изменение. Это может вызвать проблемы в будущем или когда tsc создает несколько файлов.

person Aidin    schedule 13.06.2019
comment
Спасибо, использовал tsc-watch и работает отлично, просто добавил "start": "node_modules/.bin/tsc-watch --onSuccess 'node ./src/app.js'" к package.json и теперь отлично работает с npm start :) - person Blingers; 28.04.2020

Мое решение в октябре 2018 с использованием последних версий nodemon.

сначала:
установите nodemon(npm install nodemon --save-dev) и ts-node(npm install ts-node --save-dev)

второе:
создайте nodemon.json . Мне нравится хранить мою конфигурацию nodemon в отдельном файле nodemon.json, чтобы сделать сценарии npm более удобными для чтения. Итак, создайте nodemon.json в корне проекта со следующим содержимым:

{
    "ignore": ["**/*.test.ts", "**/*.spec.ts", ".git", "node_modules"],
    "watch": ["src"], // your .ts src folder
    "exec": "npm start", // your npm script created in package.json
    "ext": "ts"
}

затем создайте свой npm start скрипт, например, так:

"scripts": {
    ...
    "start": "ts-node src/server.ts",
    "dev:ts": "nodemon",
    ...
  }

Затем запустите npm run dev:ts или yarn dev:ts, чтобы запустить и посмотреть код вашего машинописного сервера.

Для получения дополнительных конфигураций, таких как Jest модульных тестов и т. д., вы можете заглянуть в эта статья

person billyjov    schedule 07.10.2018
comment
Что делать, если nodemon.json не находится в том же каталоге, что и package.json? - person CodyBugstein; 08.10.2018
comment
Также есть некоторые серьезные проблемы с использованием nodemon и ts-node вместе. См. github.com/remy/nodemon/issues/1025. - person CodyBugstein; 08.10.2018
comment
Да, ты прав. Но больше всего проблем с операционными системами, связанными с Unix и OSX. У меня никогда не было проблем с использованием vscode и powershell/git bash под окнами. Я проверю это на других системах. - person billyjov; 08.10.2018
comment
На ваш первый вопрос. Вы также можете использовать конфигурацию nodemon в своем package.json с помощью клавиши nodemonConfig. вот рабочий процесс для этого alligator.io/workflow/nodemon - person billyjov; 08.10.2018

TypeScript-Node-Starter быстрый

https://github.com/microsoft/TypeScript-Node-Starter/blob/master/package.json

"dev": "concurrently -k -n \"TypeScript,Node\" -c \"yellow.bold,cyan.bold\" \"npm run watch-ts\" \"nodemon ./dist/app.js\"",
"watch-ts": "tsc -w"

Здесь мы даем npm run watch-ts имя TypeScript (используя concurrently -n) и добавляем цвет yellow.bold, используя concurrently -c.

Итак, я могу довольно легко распознать сообщения для каждого процесса.

person Coyolero    schedule 19.05.2019

Вот еще один способ: используйте sleep в команде concurrently перед запуском nodemon.

eg,

"scripts": {
    "dev": "concurrently -k \"tsc -p ./src/server -w\" \"tsc -p ./src/client -w\" \"sleep 5 && nodemon ./dist/server/server.js\"",
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node ./dist/server/server.js"
  },

В моей ситуации я генерирую как клиентские, так и серверные машинописные проекты одновременно, что приводит к тому, что nodemon фактически запускается 3 раза, когда я выполняю npm run dev. Но если я посплю 5 секунд до запуска процесса nodemon, то оба процесса tsc уже завершились, а затем продолжаю смотреть.

Вы также можете использовать параметр задержки nodemon, но мне это нужно только для задержки в первый раз, когда я выполняю npm run dev. После этого каждая отдельная перекомпиляция любого файла в любом проекте правильно перезапускает nodemon только один раз.

Предостережение. Если ваш сервер работает медленно, вам может потребоваться увеличить задержку перехода в спящий режим более чем на 5.

Кроме того, я попробовал принятый ответ, но мое решение было быстрее для последующих перекомпиляций, в то время как процессы nodemon и tsc watch продолжали работать.

1 секунда для моего решения против 5 секунд для принятого. Я не мог получить принятый ответ, чтобы фактически запустить tsc в режиме просмотра, поэтому он был медленнее, поскольку оба проекта TypeScript получали полную перекомпиляцию при каждом изменении.

person Sean Bradley    schedule 12.06.2020

Нормальная компиляция: если имя файла main.ts

шаг 1: tsc main.ts

шаг 2: узел main.js

Простая и одноразовая (циклическая) компиляция:

tsc main --watch

person Kushal Kulle    schedule 07.01.2019
comment
На самом деле это не отвечает на вопрос, поскольку ОП конкретно спрашивает о nodemon. - person Dan Homola; 07.01.2019