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.