Jak oglądać i ponownie ładować ts-node, gdy zmieniają się pliki TypeScript

192

Usiłuję uruchomić serwer deweloperów z TypeScript i aplikacją Angular bez transpilowania plików ts za każdym razem. Przekonałem się, że mogę to zrobić, ts-nodeale chcę także oglądać .tspliki i ponownie ładować aplikację / serwer, tak jak robiłbym to z oglądaniem gulp.

Ieltxu Algañarás
źródło

Odpowiedzi:

404

Walczyłem z tą samą rzeczą w moim środowisku programistycznym, dopóki nie zauważyłem, że nodemoninterfejs API pozwala nam zmienić jego domyślne zachowanie w celu wykonania niestandardowej komendy. Na przykład:

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

Lub jeszcze lepiej: eksternalizuj konfigurację nodemona do nodemon.jsonpliku o następującej treści, a następnie po prostu uruchom nodemon, jak sugerował Sandokan:

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

Dzięki temu będziesz mógł przeładować ts-nodeproces na żywo bez martwienia się o implementację.

Twoje zdrowie!

Zaktualizowano do najnowszej wersji nodemon:

Utwórz nodemon.jsonplik o następującej treści.

{
  "watch": ["src"],
  "ext": "ts",
  "ignore": ["src/**/*.spec.ts"],
  "exec": "ts-node ./src/index.ts"      // or "npx ts-node src/index.ts"
}
HeberLZ
źródło
jeśli index.tsjest to instancja ekspresowa, jak mogę ją zabić i zrestartować
hjl
@elaijuh teoretycznie to samo polecenie powinno załatwić sprawę, gdy nodemon jest skonfigurowany do wykonywania polecenia niestandardowego (w tym przypadku ts-node) zamiast domyślnego polecenia węzła, zamyka proces i uruchamia nowe za każdym razem znajduje zmianę w wyrażeniu zegarka minus wyrażenie ignorowania :)
HeberLZ
15
możesz także utworzyć plik nodemon.json ze wszystkimi wymienionymi opcjami, tak jak to: { "watch": ["src/**/*.ts"], "ignore": ["src/**/*.spec.ts"], "exec": "ts-node ./app-server.ts" }po prostu wpisznodemon
Sandokan El Cojo
3
Popełniłem błąd, dodając ./przed nazwami folderów i się zepsuł. Ten pracował dla mnie { "verbose": true, "watch": ["server/**/*.ts"], "ext": "ts js json", "ignore": ["server/**/*.spec.ts"], "exec": "ts-node index.ts" }. I wiersz poleceń:nodemon --watch server/**/*.ts --ignore server/**/*.spec.ts --verbose --exec ts-node index.ts
Adrian Moisa
2
Chciałbym tylko wspomnieć, że musisz również ustawić extplik konfiguracyjny, więc jego wygląd zmienia się. Mój plik konfiguracyjny wygląda następująco:{ "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

Zrzuciłem nodemoni ts-nodena rzecz znacznie lepszej alternatywy, ts-node-dev https://github.com/whitecolor/ts-node-dev

Po prostu biegnij ts-node-dev src/index.ts

Mikael Couzic
źródło
6
A dlaczego to jest lepsze?
Deilan
22
Jest szybszy i automatycznie wykrywa, które pliki należy obejrzeć, nie wymaga konfiguracji.
Mikael Couzic
4
Jest to najlepsza (jeśli nie jedyna) opcja dla węzła ts, szczególnie w przypadku większych projektów. Nie kompiluje od nowa wszystkich plików, ale wykonuje kompilację przyrostową, na przykład tsc --watch.
Angelos Pikoulas,
3
w moim przypadku jest to dosłownie 10 razy szybsze niż w nodemonprzypadku ts-node. Dziękuję Ci!
Florian
3
Więc dosłownie mam "start": "ts-node-dev src". Nie potrzebujesz babel, nodemon ani żadnej konfiguracji, która jest z nim związana. Wszystko jest załatwione za ciebie.
JMadelaine
53

Oto alternatywa dla HeberLZ za odpowiedź , za pomocą skryptów KMP.

Mój package.json:

  "scripts": {
    "watch": "nodemon -e ts -w ./src -x npm run watch:serve",
    "watch:serve": "ts-node --inspect src/index.ts"
  },
  • -e flaga ustawia rozszerzenia, których należy szukać,
  • -w ustawia obserwowany katalog,
  • -x wykonuje skrypt.

--inspectw watch:serveskrypcie jest tak naprawdę flaga node.js, po prostu włącza protokół debugowania.

im.pankratov
źródło
2
Upewnij się również, że masz lokalnie zainstalowany skrypt maszynowy dla projektu. W przeciwnym razie błąd może się nie pojawić.
Aranir,
Myślę, że właśnie ts-node --inspect -- src/index.tsz tego powodu .
bluenote10,
1
Podejście to wydaje się generować znaczną zbędną produkcję.
Freewalker
-e ts -w ./src
załatwił sprawę
16

Specjalnie dla tego numeru stworzyłem tsc-watchbibliotekę. można go znaleźć na npm .

Oczywistym przypadkiem użycia byłoby:

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

gilamran
źródło
Jak to działałoby w przypadku serwera ekspresowego lub koa, ponieważ tak naprawdę nie zabija on poprzedniej instancji węzła?
brianestey
Funkcja „tsc-watch” zabija i ponownie uruchamia proces.
gilamran
Właśnie tego szukałem. Nie jestem pewien, jaki jest cel ts-node-dev, ale nie mogłem zmusić go do zgłaszania błędów maszynopisu. Po spędzeniu godzin na próbach uruchomienia go, wypróbowałem tsc-watch i zadziałało to jak urok!
Charles Naccio
@ gilamran w dokumentacji pakietu znajduje się literówka: "[...] similar to nodemon but for TypeCcript.":)
Massimiliano Kraus
13

To działa dla mnie:

nodemon src/index.ts

Najwyraźniej dzięki od czasu tego żądania ściągnięcia: https://github.com/remy/nodemon/pull/1552

DLight
źródło
To też działa dla mnie, ale jak? Wydaje się to trochę magiczne. Co kompiluje maszynopis? Nie ts-nodezainstalowałem
d512,
1
@ d512 Czy na pewno Cię nie ma node_modules/? Dla mnie to zawodzi, jeśli go nie mam.
DLight
1
To rzeczywiście wymaga ts-nodeinstalacji. Uruchomienie tego polecenia bez ts-nodespowoduje failed to start process, "ts-node" exec not foundbłąd. Prawdopodobnie miałeś to jako resztki artefaktu w node_modules. To powiedziawszy, to rozwiązanie jest o wiele ładniejsze, ponieważ nie wymaga dodatkowej konfiguracji.
Brandon Clapp
12

Dodaj "watch": "nodemon --exec ts-node -- ./src/index.ts"do scriptssekcji swojego package.json.

takasoft
źródło
7

możesz użyć ts-node-dev

Ponownie uruchamia proces węzła docelowego, gdy zmienia się którykolwiek z wymaganych plików (jako standardowy dev-node), ale dzieli proces kompilacji maszynopisu między restartami.

zainstalować

yarn add ts-node-dev --dev

i Twój pakiet.json może być taki

"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"
}
jsina
źródło
Dziękuję Ci! To był najprostszy sposób, w jaki znalazłem, aby włączyć automatyczne przeładowanie z moim serwerem węzła.
Hisham Mubarak,
7

zrobiłem z

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

i początek przędzy. ts-node nie tak jak „ts-node”

wayan wahyu Adi Putra
źródło
1

Wolałbym nie używać ts-node i zawsze uruchamiać z folderu dist.

Aby to zrobić, po prostu skonfiguruj plik package.json z domyślną konfiguracją:

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

a następnie dodaj plik konfiguracyjny nodemon.json :

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

Tutaj używam „exec”: „npm restart”,
więc cały plik ts ponownie skompiluje się do pliku js, a następnie ponownie uruchomi serwer.

Aby uruchomić w środowisku programistycznym,

npm run dev

Korzystając z tej konfiguracji, zawsze będę działał z plików rozproszonych i nie będę potrzebował węzła ts.

Raja PB
źródło
0

dodaj to do pliku package.json

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

i aby to zadziałało, musisz również zainstalować ts-node jako zależność programistyczną

yarn add ts-node -D

uruchom, yarn devaby uruchomić serwer deweloperów

princebillyGK
źródło