使用Nodemon实现Node服务自动重载及浏览器刷新问题排查
问题解决指南
一、Nodemon重启后JSON修改不生效
问题根源是Node.js的require缓存机制:当用require()加载JSON文件时,Node会把内容缓存到内存中,即便Nodemon重启服务器,若代码未清除缓存,依然会读取旧的JSON数据。
解决办法:
- 改用文件系统读取JSON,绕过require缓存:
const fs = require('fs'); // 每次读取直接从文件获取最新内容 function getLatestJsonData() { return JSON.parse(fs.readFileSync('/Users/shaned/repos/frontend/content/your-target-file.json', 'utf8')); } - 若坚持用require,手动清除缓存:
在读取JSON前先删除对应缓存:const jsonModulePath = require.resolve('/Users/shaned/repos/frontend/content/your-target-file.json'); delete require.cache[jsonModulePath]; const jsonData = require(jsonModulePath); - 额外验证:确认nodemon.json里的
watch路径无拼写错误,目标JSON文件确实在指定目录范围内。
二、JavaScript堆内存溢出错误
Node.js v10默认堆内存限制较低,长时间运行或代码存在内存泄漏时易触发该错误。
解决办法:
- 启动时扩大堆内存限制:在启动命令中加入
--max-old-space-size参数调整内存上限(单位为MB):
可根据实际情况调整数值,比如2048、8192等。NODE_PATH=$SERVER nodemon --max-old-space-size=4096 $SERVER/backend/app.js --conf $TEST_ROOT/default.conf --test:geoip:code "" - 排查内存泄漏:
- 用
node --inspect启动服务器,通过Chrome DevTools的Memory面板分析内存占用,定位未释放的资源(如定时器、事件监听器、全局变量)。 - 确保代码中及时清理不再使用的变量、关闭数据库连接或文件句柄。
- 用
三、替代工具方案
针对Angular项目,建议拆分前后端热重载逻辑:
- 前端热重载:直接用Angular CLI的
ng serve,自带前端文件修改后的自动刷新,无需依赖后端重启。可通过proxy.conf.json配置代理,让前端请求转发到Node后端。 - 后端自动重载:
- PM2:稳定性优于Nodemon,支持watch模式:
pm2 start $SERVER/backend/app.js --watch /Users/shaned/repos/backend/server /Users/shaned/repos/frontend/content --ignore-watch="node_modules" -- --conf $TEST_ROOT/default.conf --test:geoip:code "" - Supervisor:轻量的Node进程监控工具,安装后直接启动:
supervisor -w /Users/shaned/repos/backend/server,/Users/shaned/repos/frontend/content $SERVER/backend/app.js --conf $TEST_ROOT/default.conf --test:geoip:code ""
- PM2:稳定性优于Nodemon,支持watch模式:
内容的提问来源于stack exchange,提问作者Shane D'Silva
相关产品推荐
相关产品推荐

