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?

3voto

Chetan Punkte 43934

Hier ist ein Blogbeitrag über Hot Reloading für Node. Er bietet eine github Node-Zweig die Sie verwenden können, um Ihre Node-Installation zu ersetzen und Hot Reloading zu ermöglichen.

Aus dem Blog:

var requestHandler = require('./myRequestHandler');

process.watchFile('./myRequestHandler', function () {
  module.unCacheModule('./myRequestHandler');
  requestHandler = require('./myRequestHandler');
}

var reqHandlerClosure = function (req, res) {
  requestHandler.handle(req, res);
}

http.createServer(reqHandlerClosure).listen(8000);

Jedes Mal, wenn Sie nun myRequestHandler.js ändern, wird der obige Code dies bemerken und den lokalen reqestHandler durch den neuen Code ersetzen. Bestehende Anfragen werden weiterhin den alten Code verwenden, während alle neu eingehenden Anfragen den neuen Code verwenden werden. Und das alles, ohne den Server herunterzufahren, Anfragen abzuweisen, vorzeitig zu beenden oder sich auf einen intelligenten Load Balancer zu verlassen.

0 Stimmen

Das einzige Problem bei dieser Lösung ist, dass es sich um einen Fork einer älteren Version von Node handelt, so dass sie vor der Verwendung optimiert und mit der neuesten Version zusammengeführt werden muss (es sei denn, Sie haben nichts dagegen, eine ältere Version von Node zu verwenden).

2voto

yoyo Punkte 7630

Hier ist eine einfache Methode für die Verwendung unter Windows. Fügen Sie dies in eine Batch-Datei namens serve.bat :

@echo off

:serve
start /wait node.exe %*
goto :serve

Anstatt nun zu laufen node app.js führen Sie von Ihrer cmd-Shell aus serve app.js .

Dadurch wird ein neues Shell-Fenster geöffnet, in dem der Server läuft. Die Batch-Datei wird blockiert (wegen der /wait ), bis Sie das Shell-Fenster schließen, woraufhin die ursprüngliche cmd-Shell fragt: "Terminate batch job (Y/N)?" Wenn Sie mit "N" antworten, wird der Server neu gestartet.

Jedes Mal, wenn Sie den Server neu starten wollen, schließen Sie das Server-Fenster und antworten in der cmd-Shell mit "N".

2voto

Kasra Karami Punkte 166

Meine App-Struktur:

NodeAPP (folder)
   |-- app (folder)
      |-- all other file is here
   |-- node_modules (folder)
   |-- package.json
   |-- server.js (my server file)

erste Installation neu laden mit diesem Befehl:

npm install [-g] [--save-dev] reload

dann ändern paket.json :

"scripts": {
    "start": "nodemon -e css,ejs,js,json --watch app"
}

jetzt müssen Sie reload in Ihrem Server-Datei :

var express = require('express');
var reload = require('reload');
var app = express();

app.set('port', process.env.PORT || 3000);

var server = app.listen(app.get('port'), function() {
    console.log( 'server is running on port ' + app.get('port'));
});

reload(server, app);

und für die letzte Änderung, am Ende Ihrer Antwort, senden Sie Folgendes Skript :

<script src="/reload/reload.js"></script>

Starten Sie nun Ihre Anwendung mit diesem Code:

npm start

0 Stimmen

Dieser Ansatz funktioniert jedoch nicht, da die in npmjs.com/package/reload (für Express-Anwendungen) tun.

1 Stimmen

Diese Methode funktioniert gut, und ich verwende diese Methode in einem Projekt, das Sie in diesem Pfad sehen können: github.com/KasraK2K/imensite-tutorial-site

0 Stimmen

En reload(server, app); falsch ist, müssen Sie zu reload(server); . In Ihrem Code auf Github, haben Sie es. Außerdem erhalte ich einen Fehler error TS7016: Could not find a declaration file for module 'reload' und wird ein Problem wegen der Schrift öffnen.

1voto

Endless Punkte 28715

Es ist recht einfach, dies selbst zu tun, ohne dass eine Abhängigkeit besteht... der eingebaute Datei-Überwacher ist inzwischen so ausgereift, dass er nicht mehr so sehr nervt wie früher

Sie brauchen keine komplizierten Child-Prozesse, die Sie spawnen/beenden können, und Sie brauchen nur einen einfachen Web Worker, das ist alles! Ein Web-Worker ist auch das, was ich in Browsern verwendet hätte... also bleib bei Web-Techniken! Der Worker wird auch auf der Konsole protokollieren

import { watch } from 'node:fs/promises'
import { Worker } from 'node:worker_threads'

let worker = new Worker('./app.js')

async function reloadOnChange (dir) {
  const watcher = watch(dir, { recursive: true })
  for await (const change of watcher) {
    if (change.filename.endsWith('.js')) {
      worker.terminate()
      worker = new Worker('./app.js')
    }
  }
}

// All the folder to watch for
['./src', './lib', './test'].map(reloadOnChange)

Dies könnte nicht die beste Lösung sein, wo Sie etwas anderes als Javascript verwenden und nicht auf einige Build-Prozess abhängen.

1voto

Phil Punkte 38544

Wenn Ihr Reden über Server-Seite NodeJS Hot-Reloading, sagen wir, Sie möchten eine Javascript-Datei auf dem Server, die eine Express-Route beschrieben hat, und Sie wollen diese Javascript-Datei zu Hot-Reload anstatt der Server neu starten auf Dateiänderung dann haben Rausch kann das tun.

Ein Beispiel hierfür ist basic-server

https://github.com/jaredpalmer/razzle/tree/master/examples/basic-server

Die Datei https://github.com/jaredpalmer/razzle/blob/master/examples/basic-server/src/server.js wird im laufenden Betrieb neu geladen, wenn sie geändert und gespeichert wird, der Server wird nicht neu gestartet.

Das bedeutet, dass Sie einen REST-Server programmieren können, der mit diesem Razzle einen Hot-Reload durchführen kann.

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