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?

0voto

Gadelkareem Punkte 988

Für Leute, die Vagrant und PHPStorm benutzen, Dateiüberwacher ist ein schnellerer Ansatz

  • Deaktivieren Sie die sofortige Synchronisierung der Dateien, so dass der Befehl nur beim Speichern ausgeführt wird, erstellen Sie 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 restart"

wobei forever.sh wie folgt aussieht

#!/bin/bash

cd /var/www/gadelkareem.com/ && forever $1 -l /var/www/gadelkareem.com/.tmp/log/forever.log -a app.js

0voto

Imri Punkte 31

Eine andere einfache Lösung ist fs.readFile anstelle von require verwenden können Sie eine Textdatei mit einem json-Objekt speichern und ein Intervall auf dem Server erstellen, um dieses Objekt erneut zu laden.

Profis:

  • keine Notwendigkeit, externe Bibliotheken zu verwenden
  • relevant für die Produktion (Neuladen der Konfigurationsdatei bei Änderung)
  • leicht umsetzbar

Nachteile:

  • Sie können kein Modul neu laden - nur ein json mit Schlüssel-Wert-Daten

0voto

Lellansin Punkte 762

Sie können Auto-Reload verwenden, um das Modul neu zu laden, ohne den Server herunterzufahren.

installieren

npm install auto-reload

Beispiel

data.json

{ "name" : "Alan" }

test.js

var fs = require('fs');
var reload = require('auto-reload');
var data = reload('./data', 3000); // reload every 3 secs

// print data every sec
setInterval(function() {
    console.log(data);
}, 1000);

// update data.json every 3 secs
setInterval(function() {
    var data = '{ "name":"' + Math.random() + '" }';
    fs.writeFile('./data.json', data);
}, 3000);

Ergebnis:

{ name: 'Alan' }
{ name: 'Alan' }
{ name: 'Alan' }
{ name: 'Alan' }
{ name: 'Alan' }
{ name: '0.8272748321760446' }
{ name: '0.8272748321760446' }
{ name: '0.8272748321760446' }
{ name: '0.07935990858823061' }
{ name: '0.07935990858823061' }
{ name: '0.07935990858823061' }
{ name: '0.20851597073487937' }
{ name: '0.20851597073487937' }
{ name: '0.20851597073487937' }

0voto

offlinehacker Punkte 782

Verwenden Sie dies:

function reload_config(file) {
  if (!(this instanceof reload_config))
    return new reload_config(file);
  var self = this;

  self.path = path.resolve(file);

  fs.watchFile(file, function(curr, prev) {
    delete require.cache[self.path];
    _.extend(self, require(file));
  });

  _.extend(self, require(file));
}

Alles, was Sie jetzt tun müssen, ist:

var config = reload_config("./config");

Und die Konfiguration wird automatisch neu geladen :)

0 Stimmen

Haben Sie eine Version, die sich nicht auf ein Framework verlässt, das nicht Teil von Node ist?

-1voto

eKelvin Punkte 881

Heutzutage wird der WebPack Dev Server mit der Option hot verwendet. Sie können ein Skript wie dieses 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 wird automatisch eine Neukompilierung auslösen

2 Stimmen

Diese Antwort ist in Bezug auf die Frage falsch. Webpack ist für Frontend-Anwendungen und der Dev-Server ist ein eigenständiger Webserver. Die Frage bezog sich auf eine in Node implementierte Serveranwendung. Diese braucht keinen Webserver. Sie ist bereits einer.

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