You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 04:07:10