Irgendwelche Ideen, wie ich ein automatisches Neuladen von Dateien in Node.js implementieren könnte? Ich habe es satt, den Server jedes Mal neu zu starten, wenn ich eine Datei ändere. Anscheinend lädt die require()
Funktion von Node.js keine Dateien neu, wenn sie bereits benötigt wurden. Daher muss ich Folgendes tun:
var sys = require('sys'),
http = require('http'),
posix = require('posix'),
json = require('./json');
var script_name = '/some/path/to/app.js';
this.app = require('./app').app;
process.watchFile(script_name, function(curr, prev){
posix.cat(script_name).addCallback(function(content){
process.compile( content, script_name );
});
});
http.createServer(this.app).listen( 8080 );
Und in der Datei app.js habe ich:
var file = require('./file');
this.app = function(req, res) {
file.serveFile( req, res, 'file.js');
}
Dies funktioniert aber auch nicht - ich erhalte eine Fehlermeldung in der process.compile()
Anweisung, dass 'require' nicht definiert ist. process.compile
bewertet die app.js , hat aber keine Ahnung von den globalen node.js.
javascript
node.js
disc0dancer
quelle
quelle
Object.keys(require.cache).forEach(function(key) { delete require.cache[key]; });
Antworten:
Eine gute bis Alternative auf dem neuesten Stand
supervisor
istnodemon
:Verwendung
nodemon
:quelle
$ nodemon -L yourfile.js
(vollständige Erklärung unter coderwall.com/p/aqxl_q )automatically restart the server - perfect for development
ist viel zu viel Übertreibung. Das Neuladen des Servers kann bedeuten, dass Sie sich bei Backend-Diensten anmelden, was in meinem Fall sehr lange dauert. "Perfekt für die Entwicklung" wäre so etwas wie Hot-Reloading-Klassen, während der Prozess im Speicher ausgeführt wird, ohne den Status a-la zu verlieren, was Android Studio tut, wenn Sie den Quellcode ändern.npm install [--save-dev | -D] nodemon
diese Option, um die Installation auf den Projektumfang zu beschränken.Node-Supervisor ist großartig
Verwendung zum Neustart beim Speichern:
von isaacs - http://github.com/isaacs/node-supervisor
quelle
"C:\Program Files\nodejs\node.exe" C:\Users\Mark\AppData\Roaming\npm\node_modules\supervisor\lib\cli-wrapper.js app.js
npm install supervisor
,node node_modules/supervisor/lib/cli-wrapper.js app.js
(Ich habe eine Nicht-Root-Installation von Node)PATH
Ich habe einen einfachen Weg gefunden:
quelle
delete require.cache[require.resolve('./mymodule.js')];
Lösung mit echten Pfaden lösen===
Wenn noch jemand zu dieser Frage kommt und sie nur mit den Standardmodulen lösen möchte, habe ich ein einfaches Beispiel gemacht:
Dieses Beispiel gilt nur für eine Datei (server.js), kann jedoch mithilfe eines Array von Dateien, einer for-Schleife zum Abrufen aller Dateinamen oder durch Überwachen eines Verzeichnisses an mehrere Dateien angepasst werden:
Dieser Code wurde für die Node.js 0.8-API erstellt. Er ist nicht für bestimmte Anforderungen geeignet, funktioniert jedoch in einigen einfachen Apps.
UPDATE: Diese Funktion ist in meinem Modul simpleR , GitHub repo implementiert
quelle
watch
keine Datei benötigt wird, kann das Neuladen ohnefs
Abhören durchgeführt werden , indem ein anderes Signal abgehört wird.nodemon tauchte zuerst bei einer Google-Suche auf und es scheint den Trick zu tun:
quelle
Es gibt Node-Supervisor, mit dem Sie installieren können
Siehe http://github.com/isaacs/node-supervisor
quelle
Edit: Meine Antwort ist veraltet. Node.js ist eine sich sehr schnell ändernde Technologie.
Ich habe mich auch gefragt, ob ich Module neu laden soll . Ich habe node.js geändert und die Quelle bei Github unter nalply / node veröffentlicht . Der einzige Unterschied ist die Funktion
require
. Es hat ein optionales zweites Argumentreload
.Nachladen
app.js
in das aktuelle Verzeichnis verwendenSchreiben Sie so etwas, und Sie haben Auto Reload:
Das einzige Problem, das ich sehe, ist die Variable
module
, aber ich arbeite gerade daran.quelle
nodemon
ist großartig. Ich füge einfach weitere Parameter zum Debuggen und Beobachten hinzu.package.json
Der Befehl:
nodemon --watch server --inspect ./server/server.js
Wohingegen:
--watch server
Starten Sie die App beim Wechsel.js
,.mjs
,.coffee
,.litcoffee
, und.json
Dateien in derserver
Ordner (Unterordner enthalten).--inspect
Aktivieren Sie das Remote-Debug../server/server.js
Der Einstiegspunkt.Fügen Sie dann die folgende Konfiguration zu
launch.json
(VS Code) hinzu und starten Sie das Debuggen jederzeit.Beachten Sie, dass es besser ist,
nodemon
als Entwicklungsabhängigkeit des Projekts zu installieren . Ihre Teammitglieder müssen es also nicht installieren oder sich an die Befehlsargumente erinnern, sondern nurnpm run dev
mit dem Hacken beginnen.Weitere
nodemon
Informationen finden Sie in den Dokumenten: https://github.com/remy/nodemon#monitoring-multiple-directoriesquelle
Es gab einen aktuellen Thread zu diesem Thema in der Mailingliste von node.js. Die kurze Antwort lautet "Nein". Derzeit ist es nicht möglich, erforderliche Dateien automatisch neu zu laden. Mehrere Benutzer haben jedoch Patches entwickelt, die diese Funktion hinzufügen.
quelle
Eine weitere Lösung für dieses Problem ist die Verwendung für immer
quelle
Node-Dev funktioniert großartig. npm
install node-dev
Es gibt sogar eine Desktop-Benachrichtigung, wenn der Server neu geladen wird, und gibt Erfolg oder Fehler in der Nachricht.
Starten Sie Ihre App in der Befehlszeile mit:
node-dev app.js
quelle
Hier ist ein Blog-Beitrag über Hot Reloading for Node. Es bietet einen Github-Knoten-Zweig , mit dem Sie Ihre Node-Installation ersetzen können, um das Hot-Reloading zu aktivieren.
Von dem Blog:
quelle
Ich arbeite daran, ein ziemlich kleines Knoten-Ding zu erstellen, das Module nach Belieben laden / entladen kann (dh, Sie könnten einen Teil Ihrer Anwendung neu starten, ohne die gesamte App herunterzufahren). Ich baue ein (sehr dummes) Abhängigkeitsmanagement ein, sodass, wenn Sie ein Modul stoppen möchten, auch alle davon abhängigen Module gestoppt werden.
So weit so gut, aber dann bin ich auf die Frage gestoßen, wie man ein Modul neu lädt. Anscheinend könnte man das Modul einfach aus dem "erforderlichen" Cache entfernen und die Arbeit erledigen lassen. Da ich den Knotenquellcode nicht direkt ändern möchte , habe ich mir einen sehr hackigen Hack ausgedacht: Suchen Sie im Stack den letzten Aufruf der Funktion "require" und suchen Sie einen Verweis auf das Feld "cache" und ... nun, löschen Sie den Verweis auf den Knoten:
Noch einfacher:Anscheinend funktioniert das ganz gut. Ich habe absolut keine Ahnung, was diese Argumente ["1"] bedeuten, aber es macht seinen Job. Ich glaube, dass die Node-Leute eines Tages eine Reload-Funktion implementieren werden, daher denke ich, dass diese Lösung vorerst auch akzeptabel ist. (Übrigens wird mein "Ding" hier sein: https://github.com/cheng81/wirez , geh in ein paar Wochen dorthin und du solltest sehen, wovon ich spreche)
quelle
function (module, require) { /* your code */ }
. Wenn Sie dies berücksichtigen, zeigen Siearguments[1]
aufrequire
. Die while-Schleife ist für Situationen vorgesehen, in denen Sie dies aus einer anderen Funktion in einem Modul heraus aufrufen (sie geht einfach die Funktionshierarchie hoch und überprüft die an jede übergebenen Argumentwerte).Sie können nodemon von NPM verwenden . Wenn Sie den Express-Generator verwenden, können Sie diesen Befehl in Ihrem Projektordner verwenden:
oder im Debug-Modus
Sie können auch direkt ausführen
Ich hoffe das hilft.
quelle
Lösung unter: http://github.com/shimondoodkin/node-hot-reload
Beachten Sie, dass Sie sich selbst um die verwendeten Referenzen kümmern müssen.
das heißt, wenn Sie dies getan haben: var x = require ('foo'); y = x; z = x.bar; und heiß nachgeladen.
Dies bedeutet, dass Sie die in x, y und z gespeicherten Referenzen ersetzen müssen. in der Hot-Reaload-Rückruffunktion.
Einige Leute verwechseln Hot Reload mit automatischem Neustart. Mein NodeJS-Autorestart-Modul verfügt auch über eine Upstart-Integration, um den automatischen Start beim Booten zu ermöglichen. Wenn Sie eine kleine App haben, ist ein automatischer Neustart in Ordnung, aber wenn Sie eine große App haben, ist ein Hot-Reload besser geeignet. einfach, weil heißes Nachladen schneller ist.
Auch mein Node-Inflow-Modul gefällt mir.
quelle
Es ist nicht erforderlich, nodemon oder andere solche Tools zu verwenden. Nutzen Sie einfach die Funktionen Ihrer IDE.
Wahrscheinlich am besten ist IntelliJ WebStorm mit heißer Reload - Funktion (automatischem Server und Browser neu laden) für node.js .
quelle
Hier ist eine Low-Tech-Methode zur Verwendung in Windows. Fügen Sie dies in eine Batch-Datei mit dem Namen ein
serve.bat
:Führen
node app.js
Sie jetzt aus, anstatt von Ihrer Cmd-Shell aus zu laufenserve app.js
.Dadurch wird ein neues Shell-Fenster geöffnet, in dem der Server ausgeführt wird. Die Batch-Datei wird blockiert (wegen der
/wait
) bis Sie das Shell-Fenster schließen. An diesem Punkt fragt die ursprüngliche Cmd-Shell "Batch-Job beenden (J / N)?". Wenn Sie mit "N" antworten, wird der Server neu gestartet.Schließen Sie jedes Mal, wenn Sie den Server neu starten möchten, das Serverfenster und antworten Sie in der cmd-Shell mit "N".
quelle
meine App-Struktur:
Installieren Sie zuerst reload mit diesem Befehl:
Ändern Sie dann package.json :
Jetzt müssen Sie reload in Ihrer Serverdatei verwenden :
und für die letzte Änderung, Ende Ihrer Antwort senden Sie dieses Skript :
Starten Sie jetzt Ihre App mit diesem Code:
quelle
Benutze das:
Jetzt müssen Sie nur noch Folgendes tun:
Und die Konfiguration wird automatisch neu geladen :)
quelle
loaddir ist meine Lösung zum schnellen rekursiven Laden eines Verzeichnisses.
kann zurückkehren
{ 'path/to/file': 'fileContents...' }
oder{ path: { to: { file: 'fileContents'} } }
Es hat
callback
was aufgerufen wird, wenn die Datei geändert wird.Es behandelt Situationen, in denen Dateien groß genug sind, um
watch
aufgerufen zu werden, bevor sie mit dem Schreiben fertig sind.Ich benutze es seit ungefähr einem Jahr in Projekten und habe erst kürzlich Versprechen hinzugefügt.
Hilf mir, es zu testen!
https://github.com/danschumann/loaddir
quelle
Sie können das Modul automatisch neu laden, ohne den Server herunterzufahren.
Installieren
Beispiel
data.json
test.js
Ergebnis:
quelle
Eine andere einfache Lösung besteht darin , fs.readFile anstelle von require zu verwenden. Sie können eine Textdatei speichern, die ein json-Objekt enthält, und auf dem Server ein Intervall erstellen, um dieses Objekt neu zu laden.
Profis:
Nachteile:
quelle
Für Benutzer von Vagrant und PHPStorm ist File Watcher ein schnellerer Ansatz
Deaktivieren Sie die sofortige Synchronisierung der Dateien, sodass Sie den Befehl nur beim Speichern ausführen. Erstellen Sie dann einen Bereich für die * .js-Dateien und Arbeitsverzeichnisse und fügen Sie diesen Befehl hinzu
vagrant ssh -c "/var/www/gadelkareem.com/forever.sh Neustart"
wo für immer.sh ist wie
quelle
Ich bin kürzlich auf diese Frage gekommen, weil die üblichen Verdächtigen nicht mit verknüpften Paketen arbeiteten. Wenn Sie wie ich sind und
npm link
während der Entwicklung die Vorteile nutzen, um effektiv an einem Projekt zu arbeiten, das aus vielen Paketen besteht, ist es wichtig, dass Änderungen, die in Abhängigkeiten auftreten, auch ein erneutes Laden auslösen.Nachdem sie Node-Mon und PM2 ausprobiert hatten und ihre Anweisungen zum zusätzlichen Überwachen des Ordners node_modules befolgt hatten, nahmen sie immer noch keine Änderungen auf. Obwohl die Antworten hier einige benutzerdefinierte Lösungen enthalten, ist für so etwas ein separates Paket sauberer. Ich bin heute auf Node-Dev gestoßen und es funktioniert perfekt ohne Optionen oder Konfiguration.
Aus der Readme:
quelle
quelle
Sie können dies mit Browser-Aktualisierung tun . Ihre Knoten-App wird automatisch neu gestartet. Ihre Ergebnisseite im Browser wird ebenfalls automatisch aktualisiert. Nachteil ist, dass Sie js Snippet auf die generierte Seite setzen müssen. Hier ist das Repo für das Arbeitsbeispiel.
quelle
Ich habe pm2 ausprobiert : Die Installation ist einfach und . Das Ergebnis ist zufriedenstellend. Wir müssen uns jedoch darum kümmern, welche Ausgabe von pm2 wir wollen. PM2 Runtime ist die kostenlose Edition, während PM2 Plus und PM2 Enterprise nicht kostenlos sind.
Bei Strongloop ist meine Installation fehlgeschlagen oder nicht abgeschlossen, sodass ich sie nicht verwenden konnte.
quelle
Heutzutage wird ein WebPack-Entwicklungsserver mit Hot-Option verwendet. Sie können ein solches Skript in Ihre package.json einfügen:
"hot": "cross-env NODE_ENV=development webpack-dev-server --hot --inline --watch-poll",
und jede Änderung in Ihren Dateien löst automatisch eine Neukompilierung aus
quelle