Node.js Web服务器是否会持久化已加载的模块与数据?
Node.js模块加载与变量持久化疑问
我首次使用Node.js搭建Web服务器,运行代码如下:
http.createServer(app).listen(process.env.PORT);
我习惯前端开发中将所有导入模块打包为单个JS文件后在浏览器加载。在我参考的Node.js示例项目中,存在大量require语句,例如:
var express = require('express');
我了解到Node.js仅运行单个进程(与Apache多进程模式不同),因此有两个疑问:
1. Node.js是否会一次性加载所有require的模块,后续处理请求时无需重新加载?
是的,Node.js对模块采用单次加载+缓存机制:
- 首次调用
require('模块名')时,Node.js会完成模块的加载、编译、执行全过程,并将模块的导出对象缓存到require.cache中。 - 后续任何地方再次调用同一个模块的
require,都会直接从缓存中读取已处理好的导出对象,不会重复加载或执行模块代码。 - 除非手动删除
require.cache中的对应条目,否则模块不会被重新加载。
2. Node.js是否会持久化变量?例如以下代码:
var day; if (getTodayFromSystem() == 'Monday') { day = 'Monday'; }
周一运行时day的值为'Monday',若代码常驻内存,周二day的值是否仍为'Monday',还是会变为undefined?我曾使用mod_perl,其会将脚本常驻内存,此类变量会在请求间保持状态。
Node.js进程一旦启动,会常驻内存,模块级(或全局作用域)的变量会持续保留状态,直到进程重启或变量被主动修改:
- 你示例中的
day属于模块级变量,周一进程启动时赋值为'Monday'后,只要进程不重启,这个值会一直保留,周二不会自动变回undefined。 - 这种行为和mod_perl的脚本常驻内存逻辑类似,但要注意:如果多个请求并发修改这类全局变量,会出现竞态条件,导致数据不一致。因此除非是静态不变的配置类数据,否则不建议用全局变量存储请求间的状态,推荐用数据库、Redis等外部存储来管理持久化状态。
内容的提问来源于stack exchange,提问作者user14487566
相关产品推荐
相关产品推荐

