Starten Sie den Knoten beim Ändern einer Datei neu


172

Für jemanden, der aus dem PHP-Hintergrund stammt, scheint es sehr mühsam, den Knoten zu töten und ihn nach jeder Codeänderung erneut zu starten. Gibt es ein Flag beim Starten eines Skripts mit Knoten, um den Knoten automatisch neu zu starten, wenn die Codeänderung gespeichert wird?

Antworten:


94

Das Modul forever ist ein Konzept von mehreren node.js-Servern und kann aktuell ausgeführte Server starten, neu starten, stoppen und auflisten. Es kann auch nach Änderungen der Dateien suchen und den Knoten nach Bedarf neu starten.

Installieren Sie es, wenn Sie es noch nicht haben:

npm install forever -g

Rufen Sie nach der Installation den folgenden foreverBefehl auf: Verwenden Sie das -wFlag, um die Datei auf Änderungen zu überwachen:

forever -w ./my-script.js

Darüber hinaus können Sie das Verzeichnis überwachen und Muster ignorieren:

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

+1 für immer ist sowohl für die Entwicklung / das Testen als auch für die Produktion ziemlich vielseitig.
Smertrios

1
Ich habe versucht, meinen ES2015 Expess.js / Webpack-Server mit diesem Befehl für immer neu zu starten, forever -c babel-node -w --watchDirectory ./server ./server/index.js aber leider scheint er für immer in einen Tailspin zu senden, und der Server wird zu oft neu gestartet, was dazu führt, dass Port-Fehler bereits verwendet werden Pause nach einem Neustart hinzufügen?
Brian Di Palma

1
@BrianDiPalma Sie sollten möglicherweise einige Ignoriermuster hinzufügen, wenn sich im Überwachungsverzeichnis Dateien wie Protokolle ändern. Überprüfen Sie in den Dokumenten, ob Sie eine Verzögerung zwischen Neustarts definieren können.
Hyde

1
@hyde Es war keine Verzögerung erforderlich, es war die -toder killTreeOption, die erforderlich war. Ich denke, Babel-Node wurde getötet, aber nicht der Express-Server, den es erzeugt hat.
Brian Di Palma

2
Forever JS hat einen Fehler in Windows, der den Node-Prozess nicht beendet, wenn das Skript beendet wird. Müssen den
Knotenprozess

157

Eine gute Option ist Node-Supervisor und Node.js Restart on File Change ist ein guter Artikel zur Verwendung, normalerweise:

 npm install supervisor -g

Verwenden Sie nach der Migration zum Stammverzeichnis Ihrer Anwendung Folgendes

 supervisor app.js

das gleiche hier, aus welchem ​​Grund auch immer, da ich zuvor nodemon ohne Probleme verwendet habe.
ZenMaster

1
Hat auch für mich gearbeitet. Ich musste den Standard-Wildcard-Watch-Parameter überschreiben, server.jsda er ständig neu gestartet wurde. Dies lag daran, dass mein Server den Client beim Booten aufbaute und somit die Dateien änderte. supervisor --watch server.js server.jsIch habe es gelöst.
Scipilot

2
Node-Supervisor wird nicht mehr gepflegt.
Aleung

Klappt wunderbar!!
JRichardsz

Mein Favorit: Aktualisierungsintervalle, um zu überprüfen, ob die Datei geändert wurde, sind fast augenblicklich!
NiCk Newman

100

Sie sollten sich so etwas wie Nodemon ansehen .

Nodemon überwacht die Dateien in dem Verzeichnis, in dem nodemon gestartet wurde. Wenn sie sich ändern, wird Ihre Knotenanwendung automatisch neu gestartet.

Beispiel:

nodemon ./server.js localhost 8080

oder einfach

nodemon server

Irgendeine Idee, warum Node einen Neustart benötigt, um Codeänderungen zu implementieren? Und warum müssen andere Server (wie Apache / PHP) nicht neu gestartet werden?
Außenseiter

2
@ dk49, da in diesem Fall PHP-Skripte für jede eingehende Anforderung gestartet und nach dem Generieren der Seite gestoppt werden.
Daerdemandt

@Daerdemandt, danke, dass du das geteilt hast. Aber ich habe immer noch nicht verstanden, warum der Server (auf jeder Plattform) gestartet und gestoppt werden muss. Liegt es daran, dass ein Cache mit Dateien (Antworten) verwaltet wird? Ich dachte, dass der Server die Dateien zum Zeitpunkt der Anforderung von der Festplatte laden, verarbeiten und dann die Antwort senden wird. Ich bin neu in der serverseitigen Programmierung.
Außenseiter

Können / sollten Sie nodemon in einer Produktionsumgebung verwenden?
JoeTidee

1
Ich bin mir nicht sicher, wie sich nodemon heute noch behauptet (wie dies 2012 war), aber aus Sicherheitsgründen bin ich mir nicht sicher, ob ich meinen Server auf prod neu starten möchte, wenn sich eine Datei ändert. So etwas wie pm2 ist möglicherweise besser für eine Produktionsumgebung geeignet.
Menztrual

43

Zur Erleichterung dieser Aufgabe stehen verschiedene NPM-Pakete zur Verfügung.

Zur Entwicklung

Für die Produktion (mit erweiterten Funktionen wie Clustering, Remote-Bereitstellung usw.)

Ein Vergleich zwischen Forever, pm2 und StrongLoop finden Sie auf der Website von StrongLoop .


3
@ 2019 nodemon scheint die einzige der 4 Entwicklungsoptionen zu sein, die noch beibehalten wird.
Mvermand

1
@mvermand Ja, für keine von ihnen wurden kürzlich neue Versionen veröffentlicht, außer für nodemon. Für die Produktion ist PM2 noch gut gewartet.
Kay

16

Sie können auch nodemon ausprobieren

So installieren Sie Nodemon

npm install -g nodemon

So verwenden Sie Nodemon

Normalerweise starten wir das Knotenprogramm wie folgt:

node server.js

Aber hier muss man gerne machen:

nodemon server.js

Gute und einfache Antwort !!
Lesimoes

1
nodemon hat nervige Fehler. Es war eine Zeitverschwendung für mich.
kta

Wie unterscheidet sich diese Antwort von der Nodemon-Antwort 2012 ?
Dan Dascalescu

9

Node-Dev

Node-Dev ist eine großartige Alternative zu Nodemon und Supervisor für Entwickler, die bei jedem Neustart des Servers oder bei einem Fehler oder einer Änderung in der Datei Knurr- (oder Libnotify-) Benachrichtigungen auf ihrem Desktop erhalten möchten .

Installation:

npm install -g node-dev

Verwenden Sie node-dev anstelle von node:

node-dev app.js

Benachrichtigung beim Ändern der Datei, damit der Server automatisch gestartet wird

Geben Sie hier die Bildbeschreibung ein

Konsole ausstellen

Geben Sie hier die Bildbeschreibung ein


3

Ich benutze runjswie:

runjs example.js

Das Paket heißt nur run

npm install -g run

2
es ist nicht besser, nur eine andere Option
sp2danny

Diese Antwort wäre viel wertvoller, wenn sie erklären würde, warum Sie sie verwenden runund wie sie im Vergleich zu vorhandenen Alternativen ist. Nur eine andere Option zu entleeren, trägt nur zum Paradox der Wahl bei. (Glücklicherweise runwurde es seit 2015 nicht mehr aktualisiert, daher ist es jetzt keine große Option.)
Dan Dascalescu

0

Folge den Schritten:

  1. npm install --save-dev nodemon

  2. Fügen Sie die folgenden zwei Zeilen zum Abschnitt "script" von package.json hinzu:

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

Wie nachfolgend dargestellt:

"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


Nun, es ist im Wesentlichen die gleiche Antwort wie 2012 , aber mit mehr "Magie". Aber das Wesentliche der Antwort ist "use nodemon". Der Reset ist tangential. Und es war schlecht formatiert, aber ich sehe, dass David das behoben hat, also werde ich meine Ablehnung rückgängig machen.
Dan Dascalescu
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.