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
