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?

813voto

Marius Butuc Punkte 16731

Eine gute, zeitgemäße Alternative zu supervisor es nodemon :

Überwacht alle Änderungen in Ihrer node.js-Anwendung und startet den Server automatisch neu - perfekt für die Entwicklung

Zu verwenden nodemon mit Version von Node ohne npx (v8.1 und darunter, nicht empfohlen):

$ npm install nodemon -g
$ nodemon app.js

Oder zu verwenden nodemon mit Versionen von Node mit npx gebündelt (v8.2+):

$ npm install nodemon
$ npx nodemon app.js

Oder als devDependency mit einem npm-Skript in der package.json:

"scripts": {
  "start": "nodemon app.js"
},
"devDependencies": {
  "nodemon": "..."
}

3 Stimmen

Und wenn Sie es in Nitrous.io -- $ nodemon -L yourfile.js (vollständige Erklärung unter coderwall.com/p/aqxl_q )

5 Stimmen

In diesem Fall wird jedoch auch der Serverprozess neu gestartet.

0 Stimmen

@Filipe, Sie haben Recht. Ich werde wieder zum Login weitergeleitet. Ich wünschte, es würde nur dieses spezielle geänderte Modul geladen.

324voto

Anup Bishnoi Punkte 3197

Node-Supervisor ist großartig

Verwendung zum Neustart beim Speichern für alte Node-Versionen (nicht empfohlen):

npm install supervisor -g
supervisor app.js

Verwendung zum Neustart beim Speichern für Node-Versionen, die mit npx :

npm install supervisor
npx supervisor app.js

oder direkt anrufen supervisor in einem npm-Skript:

"scripts": {
  "start": "supervisor app.js"
}

4 Stimmen

Npm install -g supervisor. Es sollte global installiert werden.

0 Stimmen

Unter OSx 10.2.8 musste ich es mit sudo ausführen

2 Stimmen

So musste es unter Windows laufen: "C:\Program Files\nodejs\node.exe" C:\Users\Mark\AppData\Roaming\npm\node_modules\supervisor\li‌​b\cli-wrapper.js app.js

106voto

Inshua Punkte 1041

Ich habe einen einfachen Weg gefunden:

delete require.cache['/home/shimin/test2.js']

7 Stimmen

Dies ist ideal, wenn Sie externe Bibliotheken nachladen möchten, ohne die Anwendung neu zu starten - in meinem Fall einen IRC-Bot.

0 Stimmen

Das ist hervorragend! Es ist so einfach und funktioniert so gut. Jedes Mal, wenn eine Anfrage kommt in ich nur uncache eine Reihe von Dateien, die nicht halten Zustand.

22 Stimmen

delete require.cache[require.resolve('./mymodule.js')]; den Umgang mit realen Pfaden auflösen

27voto

micnic Punkte 10148

Falls jemand noch auf diese Frage kommt und sie nur mit den Standardmodulen lösen will, habe ich ein einfaches Beispiel gemacht:

var process = require('process');
var cp = require('child_process');
var fs = require('fs');

var server = cp.fork('server.js');
console.log('Server started');

fs.watchFile('server.js', function (event, filename) {
    server.kill();
    console.log('Server stopped');
    server = cp.fork('server.js');
    console.log('Server started');
});

process.on('SIGINT', function () {
    server.kill();
    fs.unwatchFile('server.js');
    process.exit();
});

Dieses Beispiel bezieht sich nur auf eine Datei (server.js), kann aber mit einem Array von Dateien, einer for-Schleife zum Abrufen aller Dateinamen oder der Überwachung eines Verzeichnisses an mehrere Dateien angepasst werden:

fs.watch('./', function (event, filename) { // sub directory changes are not seen
    console.log(`restart server`);
    server.kill();
    server = cp.fork('server.js');    
})

Dieser Code wurde für die Node.js 0.8 API erstellt, er ist nicht für bestimmte Bedürfnisse angepasst, wird aber in einigen einfachen Anwendungen funktionieren.

UPDATE: Diese Funktion ist in meinem Modul implementiert einfachR , GitHub-Repositorium

1 Stimmen

Dies ist eine großartige und einfache Lösung. Ich habe sie gerade für einen Bot verwendet, der sich selbst aus Git aktualisieren sollte, wenn er von einem Moderator dazu aufgefordert wurde. Das Problem war, dass man sich nicht selbst neu starten kann, sobald man sich in der App befindet. Ich kann jedoch Ihre Methode verwenden, um eine Instanz des Bots zu erzeugen und eine Punktdatei zu überwachen. Der Bot aktualisiert sich dann selbst, berührt die Dotfile und wird automatisch vom Launcher neu gestartet. Großartig!

0 Stimmen

@Fred ich bin froh, das zu hören :) Ich werde diese Lösung in einem Modul implementieren, bald, denke ich, habe ich einige weitere Ideen, wie man seine Funktionalität zu erweitern

0 Stimmen

Wenn Datei watch nicht erforderlich ist, kann das Nachladen ohne fs durch Abhören verschiedener Signale.

26voto

Sanjay Punkte 281

Nodemon ist seit langem das Mittel der Wahl, wenn es darum geht, den Server bei Dateiänderungen neu zu starten. Mit Node.js 19 haben sie nun eine --watch Flagge, die das Gleiche bewirkt [experimentell]. Dokumente

node --watch index.js

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