Node.js:本地小脚本反复跑,可以试试 `node --watch`

61 次浏览4 条回复

改一个小工具时,经常是保存、回到终端、再跑一遍。Node 18+ 自带 --watch,简单脚本可以先不用额外装 nodemon。

环境:Node.js 18+。建个文件 watch-demo.mjs

const now = new Date().toISOString()
console.log('script started at', now)

console.log('edit this file and save, node will restart it')

跑起来:

node --watch watch-demo.mjs

然后随便改一下 watch-demo.mjs 再保存,终端里会重新执行。

这个更适合本地开发时反复试脚本、看输出变化。真到复杂项目,还是项目自己的 dev server 或专门工具更稳一点。

补一个小细节:如果不想每次重启都把终端输出清掉,可以加 --watch-preserve-output

node --watch --watch-preserve-output watch-demo.mjs

调那种会打印一堆中间状态的小脚本时挺有用,前后两次输出能直接对着看。

这个用来跑一次性脚本确实省事。

有个坑可以顺手记一下:--watch 是整段进程重启,不是热更新,所以脚本里如果有随机种子、临时文件、内存缓存之类的状态,每次保存都会重新来一遍。调命令行工具还好,调带副作用的脚本时最好先把输出目录或测试数据隔开一点。

还有一种场景也挺常见:脚本本身没改,但旁边的配置文件或样例数据改了。

如果那个文件不是通过 import / require 进来的,--watch 不一定会因为它变化而重启,可以把路径也写上:

node --watch --watch-path=config.json watch-demo.mjs

小脚本读本地 JSON、模板文件的时候比较容易遇到这个。路径多了以后就别硬撑了,还是交给项目自己的 dev 命令更省心。

顺着楼上那个 --watch-path 再补一句:这个参数在不同系统上的支持不太一样,Linux 环境里最好先跑一下确认,别直接写进团队脚本里当成稳定能力。

如果只是本地自己调小工具,用 node --watch xxx.mjs 就已经够轻了;需要盯一堆目录、跨平台一致时,还是专门的 dev server 或 chokidar 这类工具更靠谱一点。