Zrestartuj węzeł po zmianie pliku


172

Dla kogoś, kto pochodzi z PHP w tle, proces zabijania węzła i ponownego uruchamiania go po każdej zmianie kodu wydaje się bardzo żmudny. Czy jest jakaś flaga podczas uruchamiania skryptu z węzłem, aby automatycznie zrestartować węzeł po zapisaniu zmiany kodu?

Odpowiedzi:


94

zawsze moduł ma koncepcję wielu serwerach node.js i można rozpocząć, restart, stop oraz lista serwerów aktualnie uruchomione. Może również obserwować zmiany plików i restartować węzeł w razie potrzeby.

Zainstaluj go, jeśli jeszcze go nie masz:

npm install forever -g

Po zainstalowaniu, wywołaj foreverpolecenie: użyj -wflagi, aby obejrzeć plik pod kątem zmian:

forever -w ./my-script.js

Dodatkowo możesz obserwować katalog i ignorować wzorce:

forever --watch --watchDirectory ./path/to/dir --watchIgnore *.log ./start/file

+1 na zawsze jest dość wszechstronny zarówno w przypadku programowania / testowania, jak i produkcji.
smertrios

1
Próbowałem używać na zawsze, aby ponownie uruchomić serwer ES2015 Expess.js / Webpack za pomocą tego polecenia, forever -c babel-node -w --watchDirectory ./server ./server/index.js ale niestety wydaje się, że wysyła się na zawsze w tailspin i zbyt często restartuje serwer, co powoduje błędy portu już w użyciu ... czy jest jakiś sposób dodać pauzę po ponownym uruchomieniu?
Brian Di Palma

1
@BrianDiPalma Być może powinieneś dodać jakieś wzorce ignorowania, jeśli są jakieś zmieniające się pliki, takie jak logi, w katalogu obserwacyjnym. Sprawdź w dokumentach, czy możesz zdefiniować opóźnienie między ponownymi uruchomieniami.
hyde

1
@hyde To nie było opóźnienie, które było wymagane, to była wymagana opcja -tlub killTree, myślę, że węzeł babel był zabijany, ale nie serwer Express, który się pojawił.
Brian Di Palma

2
Forever JS ma błąd w Windows, który nie zabija procesu Node po zakończeniu skryptu. Trzeba ręcznie zabić proces węzła :( stackoverflow.com/questions/14556852/ ...
pmont

157

Dobrym rozwiązaniem jest Node-supervisor, a Node.js Restart on File Change to dobry artykuł o tym, jak go używać, zazwyczaj:

 npm install supervisor -g

a po migracji do katalogu głównego aplikacji użyj następującego

 supervisor app.js

to samo tutaj, z jakiegokolwiek powodu, tak jak wcześniej użyłem nodemon bez żadnego problemu.
ZenMaster,

1
Dla mnie też zadziałało. Musiałem zastąpić domyślny parametr obserwacyjny z symbolem wieloznacznym na, server.jsponieważ ciągle się restartował, było to spowodowane tym, że mój serwer budował klienta podczas rozruchu, a tym samym zmieniał pliki. supervisor --watch server.js server.jsrozwiązałem to.
scipilot

2
Node-Supervisor nie jest już utrzymywany.
aleung

Działa jak marzenie!!
JRichardsz

Mój ulubiony, interwały odświeżania, aby sprawdzić, czy plik został zmodyfikowany, są prawie natychmiastowe!
NiCk Newman

100

Powinieneś spojrzeć na coś takiego jak nodemon .

Nodemon będzie obserwował pliki w katalogu, w którym został uruchomiony nodemon, a jeśli się zmienią, automatycznie zrestartuje aplikację węzła.

Przykład:

nodemon ./server.js localhost 8080

lub po prostu

nodemon server

Masz jakiś pomysł, dlaczego Node wymaga ponownego uruchomienia, aby zaimplementować zmiany w kodzie? I dlaczego inne serwery (takie jak Apache / PHP) nie wymagają ponownego uruchomienia?
Maverick

2
@ dk49, ponieważ skrypty PHP w tym przypadku są uruchamiane dla każdego przychodzącego żądania i zatrzymywane po zakończeniu generowania strony.
Daerdemandt

@Daerdemandt dzięki za udostępnienie tego… ale nadal nie rozumiem, dlaczego serwer (na dowolnej platformie) musi się uruchamiać i zatrzymywać? Czy to dlatego, że utrzymuje pamięć podręczną plików (odpowiedzi)? Myślałem, że serwer będzie ładował pliki z dysku w momencie żądania, przetworzy je i wyśle ​​odpowiedź. Jestem nowy w programowaniu po stronie serwera.
Maverick

Czy możesz / powinieneś używać nodemona w środowisku produkcyjnym?
JoeTidee

1
Nie jestem pewien, jak nodemon nadal radzi sobie dzisiaj (tak jak było to w 2012 roku), ale ze względów bezpieczeństwa nie jestem pewien, czy chciałbym, aby mój serwer był ponownie uruchamiany w wersji produkcyjnej po każdej zmianie pliku. Coś w rodzaju pm2 może być bardziej odpowiednie dla środowiska produkcyjnego.
Menztrual

43

Aby ułatwić to zadanie, dostępne są różne pakiety NPM.

Dla rozwoju

  • nodemon : najpopularniejszy i aktywnie utrzymywany
  • na zawsze : drugie miejsce pod względem popularności
  • node-dev : brak zatwierdzeń od maja 2019
  • przełożony : - już nie jest obsługiwany

Do produkcji (z rozszerzonymi funkcjami, takimi jak klastrowanie, zdalne wdrażanie itp.)

Porównanie Forever, pm2 i StrongLoop można znaleźć na stronie internetowej StrongLoop .


3
@ 2019 nodemon wydaje się jedyną z 4 opcji rozwoju, która jest nadal utrzymywana.
mvermand

1
@mvermand Tak, ostatnio żadne nowe wydania nie zostały wydane dla żadnego z nich, z wyjątkiem nodemon. W przypadku produkcji PM2 jest nadal dobrze utrzymany.
Kay


9

node-dev

node-dev jest świetną alternatywą zarówno dla nodemona, jak i przełożonego dla programistów, którzy lubią otrzymywać powiadomienia o growlu (lub libnotify) na swoim pulpicie za każdym razem, gdy serwer uruchamia się ponownie lub gdy występuje błąd lub zmiana w pliku .

Instalacja:

npm install -g node-dev

Użyj node-dev zamiast node:

node-dev app.js

Powiadomienie o zmianie pliku, aby serwer był uruchamiany automatycznie

wprowadź opis obrazu tutaj

konsola się

wprowadź opis obrazu tutaj


3

Używam runjsjak:

runjs example.js

Pakiet nazywa się just run

npm install -g run

2
nie jest lepiej, po prostu inna opcja
sp2danny

Ta odpowiedź byłaby o wiele bardziej wartościowa, gdyby wyjaśniała, dlaczego używasz runi jak porównuje się z istniejącymi alternatywami. Samo zrzucenie innej opcji tylko pogłębia paradoks wyboru. (Na szczęście runnie był aktualizowany od 2015 roku, więc teraz nie jest to zbyt duży wybór).
Dan Dascalescu

0

Wykonaj kroki:

  1. npm install --save-dev nodemon

  2. Dodaj następujące dwa wiersze do sekcji „script” pliku package.json:

"start": "node ./bin/www",
"devstart": "nodemon ./bin/www"

jak pokazano niżej:

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node ./bin/www",
    "devstart": "nodemon ./bin/www"
}
  1. npm run devstart

https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/skeleton_website


Cóż, jest to zasadniczo ta sama odpowiedź, co odpowiedź z 2012 roku , ale obecna z większą „magią” wokół niej. Ale istotą odpowiedzi jest „użyj nodemon”. Reset jest styczny. Było źle sformatowane, ale widzę, że David to naprawił, więc cofnę mój głos przeciw.
Dan Dascalescu
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.