稍微写过一点 node 应用的同学应该都有类似的经历,编写一段代码,运行一个 http server,保存为 js 文件,例如 app.js , 然后执行命令
node app.js
此时 node 就会执行我们刚才书写的代码。此时一切看起来都很美好,但是随着开发继续,一些问题也会逐渐显现出来。
每过一段时间,我们都想看下刚才书写都代码是否能够正常运行,那么每次保存代码以后,我们都不得不 ctrl + C 结束掉刚才的 server,然后重新运行这段脚本。于是乎一些能够监听文件变化并支持自动重启的工具就出现在了我们的视线中。比如 hotnode,supervisor 等等。这些工具能够很好的节约开发者在重复操作上花费的时间,能够把经历更加专注在其他方面。
下面说一下如何实现一个极简的工具。
文件监听
fs.watch()
fs,File System 的缩写,利用这个 API,我们可以对文件或者目录进行监听。当监听到文件变化后,执行预设的回调函数。
fs.watch("app.js", (event, filename) => {
// 文件变化时触发的回调函、
});
细心的小伙伴可能已经想到了,文件发生变化,我再去执行一个什么函数,把app.js再重新执行一下,是不是就可以了?
你说的没错。
自动重启
API: child_process.spawn
我们使用 spawn 开启一个新的进程,然后在在这个进程中执行 js 脚本即可,话不多说,上栗子:
const { spawn } = require("child_process");
let process = null;
function startProcess() {
// 执行js脚本
process = spawn("node", ["app.js"]);
// 打印输出到控制台
process.stdout.on("data", data => {
console.log(data.toString());
});
}
// 有了start,还要有个restart
function restartProcess() {
if (process !== null) {
try {
// 清除进程,
process.kill("SIGKILL");
} catch (error) {
console.log("Exception: " + error.message, "bad");
}
}
// 然后这里再次启动,可以说很像清除定时器的操作了~
startProcess();
}
最后,我们把restartProcess放到fs.watch的回调函数里,再让startProcess和fs.watch顺序执行就好了。像这样:
fs.watch("app.js", (event, filename) => {
restartProcess();
});
startProcess();
如果你想写一个放心能用的工具,还是有很多东西要解决的,比如即使没有修改文件内容,单纯的按下保存,也会触发 watch 函数的回调。这需要采取一定的策略去判断保存前后文件内容是否有变动。
有兴趣的同学也可以去看下另一个库的代码,watch,链接:www.npmjs.com/package/wat…
以上