javascript - Hur man automatiskt laddar om filer i Node.js?


Några idéer om hur jag skulle kunna implementera en automatisk omladdning av filer i Node.js? Jag är trött på att starta om servern varje gång jag ändrar en fil. Tydligen laddar inte Node.js require()-funktionen om filer om de redan har krävts, så jag behöver göra något liknande detta:

var 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 );

Och i app.js-filen har jag:

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

Men detta fungerar inte heller - jag får ett fel i process.compile()-satsen som säger att 'require' inte är definierad. process.compile kör app.js, men har ingen aning om node.js-globala variabler.

Svar #1

Ett bra, uppdaterat alternativ till supervisor är nodemon:

Övervaka för eventuella förändringar i din node.js-applikation och starta automatiskt om servern - perfekt för utveckling

För att använda nodemon med en version av Node utan npx (v8.1 och nedan, ej rekommenderat):

npm install nodemon -g
nodemon app.js

Eller för att använda nodemon med versioner av Node med npx inkluderat (v8.2+):

npm install nodemon
npx nodemon app.js

Eller som devDependency i ett npm-script i package.json:

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

Svar #2

node-supervisor är fantastisk

användning för att starta om vid sparande för gamla Node-versioner (inte rekommenderat):

npm install supervisor -g
supervisor app.js

användning för att starta om vid sparande för Node-versioner som levereras med npx:

npm install supervisor
npx supervisor app.js

eller kalla direkt på supervisor i ett npm-skript:

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

Svar #3

jag hittade ett enkelt sätt:

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

Svar #4

Nodemon har länge varit det självklara valet för att starta om servern vid filändringar. Nu med Node.js 19 har de introducerat en --watch-flagga, som gör samma sak [experimentell]. Dokumentation

node --watch index.js

Svar #5

Om någon fortfarande kommer till denna fråga och vill lösa den endast med standardmodulerna har jag gjort ett enkelt exempel:

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();
});

Detta exempel är endast för en fil (server.js), men kan anpassas till flera filer genom att använda en matris av filer, en for-loop för att få alla filnamn, eller genom att bevaka en katalog:

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

Denna kod skapades för Node.js 0.8 API, den är inte anpassad för några specifika behov men kommer att fungera i några enkla appar.

UPPDATERING: Denna funktionalitet är implementerad i min modul simpleR, GitHub-repo

Svar #6

nodemon dök upp först i en Google-sökning, och det verkar fungera:

npm install nodemon -g
cd whatever_dir_holds_my_app
nodemon app.js

Svar #7

nodemon är ett utmärkt verktyg. Jag lägger bara till fler parametrar för felsökning och övervakningsalternativ.

package.json

  "scripts": {
    "dev": "cross-env NODE_ENV=development nodemon --watch server --inspect ./server/server.js"
  }

Kommandot: nodemon --watch server --inspect ./server/server.js

Medan :

--watch server Starta om appen när du ändrar .js, .mjs, .coffee, .litcoffee och .json-filer i server-mappen (inklusive undermappar).

--inspect Aktivera fjärrfelsökning.

./server/server.js Ingångspunkten.

Lägg sedan till följande konfiguration i launch.json (VS Code) och börja felsöka när som helst.

{
    "type": "node",
    "request": "attach",
    "name": "Attach",
    "protocol": "inspector",
    "port": 9229
}

Observera att det är bättre att installera nodemon som en utvecklingsberoende i projektet. Så dina teammedlemmar behöver inte installera det eller komma ihåg kommandoradsargumenten, de behöver bara npm run dev och börja koda.

Se mer i nodemon-dokumentationen: https://github.com/remy/nodemon#monitoring-multiple-directories

Relaterade artiklar