573 Stimmen

Wie lädt man Dateien in Node.js automatisch neu?

Irgendwelche Ideen, wie ich ein automatisches Neuladen von Dateien in Node.js implementieren könnte? Ich bin es leid, den Server jedes Mal neu zu starten, wenn ich eine Datei ändere. Anscheinend Node.js' require() Funktion lädt keine Dateien neu, wenn sie bereits angefordert wurden, also muss ich so vorgehen:

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 app.js Datei, die ich habe:

var file = require('./file');
this.app = function(req, res) { 
    file.serveFile( req, res, 'file.js');  
}

Aber auch das funktioniert nicht - ich erhalte einen Fehler in der process.compile() Anweisung, die besagt, dass 'require' nicht definiert ist. process.compile wertet die app.js , hat aber keine Ahnung von den node.js-Globals.

5 Stimmen

Sie wissen, dass Sie diesen Code einfach bei jeder Anfrage ausführen können: Object.keys(require.cache).forEach(function(key) { delete require.cache[key]; });

1 Stimmen

0 Stimmen

Warum haben Sie zwei js-Dateien, app.js als Serverdatei sollte ausreichen?

6voto

Xavi Punkte 19701

Vor kurzem (2009) gab es eine Gewinde über dieses Thema auf der node.js Mailingliste. Die kurze Antwort ist nein, es ist derzeit nicht möglich, benötigte Dateien automatisch nachzuladen, aber mehrere Leute haben Patches entwickelt, die diese Funktion hinzufügen.

1 Stimmen

+1 Ja. Ich habe mich an der Diskussion beteiligt. Ich habe zugegeben, dass meine Lösung zu einfach ist. Sie funktioniert nur, wenn das Hot-Modul selbst keine weiteren Module benötigt. Felix' Lösung ist besser durchdacht, aber es ist umstritten, ob Auto -Wiederaufladung gehört wirklich zum Kern.

6voto

Mit Node.js 19 können Sie Dateiänderungen mit der --watch Option. Nachdem eine Datei geändert wurde, wird der Prozess automatisch neu gestartet, wobei die neuen Änderungen berücksichtigt werden.

node --watch server.js

4voto

Teoman shipahi Punkte 45327

Eine weitere Lösung für dieses Problem ist die Verwendung von für immer

Eine weitere nützliche Fähigkeit von Forever ist, dass es optional die Ihre Anwendung neu starten kann, wenn sich Quelldateien geändert haben. Dies befreit Sie Sie nicht jedes Mal manuell neu starten müssen, wenn Sie eine Funktion hinzufügen oder einen Fehler beheben. Um Forever in diesem Modus zu starten, verwenden Sie die Option -w:

forever -w start server.js

0 Stimmen

Seltsamerweise mit dem Flag -w meine express.js app nicht verwenden CSS.

0 Stimmen

Forever' wird nicht als internes oder externes Kommando, lauffähiges Programm oder Batch-Datei erkannt.

3voto

cheng81 Punkte 2394

Ich arbeite daran, ein ziemlich winziges Node-"Ding" zu bauen, das in der Lage ist, Module nach Belieben zu laden/entladen (so dass man z.B. in der Lage sein könnte, einen Teil der Anwendung neu zu starten, ohne die gesamte Anwendung herunterzufahren). Ich baue ein (sehr dummes) Abhängigkeitsmanagement ein, so dass, wenn man ein Modul stoppen will, alle Module, die davon abhängen, ebenfalls gestoppt werden.

So weit, so gut, aber dann stolperte ich über das Problem, wie man ein Modul neu laden kann. Anscheinend konnte man das Modul einfach aus dem "require"-Cache entfernen und die Aufgabe war erledigt. Da ich keine Lust habe, direkt den Node-Quellcode zu ändern, habe ich mir eine muy hacky-hack, das ist: suchen Sie in der Stack-Trace den letzten Aufruf der "require"-Funktion, greifen Sie einen Verweis auf seine "Cache"-Feld und gut, löschen Sie den Verweis auf den Knoten:

~~var args = arguments while(!args['1'] || !args['1'].cache) { args = args.callee.caller.arguments } var cache = args['1'].cache util.log('remove cache ' + moduleFullpathAndExt) delete( cache[ moduleFullpathAndExt ] )~~

Eigentlich ist es sogar noch einfacher:

var deleteCache = function(moduleFullpathAndExt) {
  delete( require.cache[ moduleFullpathAndExt ] )
}

Offenbar funktioniert das ganz gut. Ich habe absolut keine Ahnung, was das arguments["1"] bedeutet, aber es tut seine Arbeit. Ich glaube, dass die Node-Jungs eines Tages eine Reload-Funktion implementieren werden, also denke ich, dass diese Lösung für den Moment auch akzeptabel ist. (btw. mein "Ding" wird hier sein: https://github.com/cheng81/wirez Gehen Sie in ein paar Wochen dorthin und Sie werden sehen, wovon ich spreche.)

0 Stimmen

Ist natürlich nicht so einfach. Das funktioniert nur, wenn Es gibt einen Aufruf an require im Aufrufstapel. Nun gut, ein einfacher Hack auf einem Hack: Schreiben Sie das Zeug in ein temporäres Skript und fordern Sie es zur Laufzeit. Gesagt getan, es funktioniert und es löscht sich sogar selbst aus dem Cache

0 Stimmen

Und eigentlich war es einfacher: delete( require.cache[moduleFullpathAndExt] )

0 Stimmen

Node.js-Module sind eigentlich in eine anonyme Funktion verpackt, was die Modulkapselung ausmacht. Jedes Modul sieht eigentlich aus wie function (module, require) { /* your code */ } . Wenn Sie dies berücksichtigen, arguments[1] zeigt auf require . Und die while-Schleife ist für Situationen gedacht, in denen Sie diese Funktion von einer anderen Funktion in einem Modul aus aufrufen (sie durchläuft einfach die Funktionshierarchie und prüft die an die einzelnen Funktionen übergebenen Argumentwerte).

3voto

Shimon Doodkin Punkte 3946

Lösung bei: 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 Folgendes getan haben: var x=require('foo'); y=x;z=x.bar; und heiß neu geladen es.

bedeutet dies, dass Sie die in x, y und z gespeicherten Referenzen in der Hot-Reaload-Callback-Funktion ersetzen müssen.

manche Leute verwechseln Hot Reload mit Auto-Neustart mein nodejs-autorestart-Modul hat auch eine Uptart-Integration, um einen 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 heißer Neustart besser geeignet, einfach weil ein heißer Neustart schneller ist.

Auch ich mag mein node-inflow Modul.

0 Stimmen

Das ist ein schönes Stück!

0 Stimmen

Dies ist ein altes Dokument, sorry

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X