关于我如何在Node.js中实现文件的自动重载有什么想法吗?我厌倦了每次更改文件时重新启动服务器。
显然,Node.js的require()函数不会重新加载文件,如果他们已经被要求,所以我需要做这样的事情:
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 );
在app.js文件中,我有:
var file = require('./file');
this.app = function(req, res) {
file.serveFile( req, res, 'file.js');
}
但这也不能工作-我在process.compile()语句中得到一个错误,说'require'没有定义。Process.compile正在计算app.js,但没有关于node.js全局变量的线索。
这里有一个在Windows中使用的低技术方法。把它放在一个名为server .bat的批处理文件中:
@echo off
:serve
start /wait node.exe %*
goto :serve
现在,不是从cmd shell运行node app.js,而是运行serve app.js。
这将打开一个运行服务器的新shell窗口。批处理文件将阻塞(因为/wait),直到您关闭shell窗口,此时原始的cmd shell将询问“终止批处理作业(Y/N)?”如果您回答“N”,则服务器将重新启动。
每次要重新启动服务器时,关闭服务器窗口并在cmd shell中回答“N”。
你可以通过浏览器刷新来实现。您的节点应用程序自动重启,您的结果页面在浏览器也自动刷新。缺点是你必须把js片段生成的页面。下面是工作示例的回购。
const http = require('http');
const hostname = 'localhost';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/html; charset=UTF-8');
res.write('Simple refresh!');
res.write(`<script src=${process.env.BROWSER_REFRESH_URL}></script>`);
res.end();
})
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
if (process.send) {
process.send({ event: 'online', url: `http://${hostname}:${port}/` })
}
});