NextJS项目中:如何通过Global Object在HMR中保留值?
关于Next.js MongoDB Starter中HMR全局变量的作用解释
这段代码的核心是解决开发环境下热模块替换(HMR)导致的MongoDB连接重复创建问题,关键逻辑其实在同模块的其他部分:
- 开发环境下模块首次加载时,会创建MongoClient并将连接Promise存入
global._mongoClientPromise,同时赋值给模块内的clientPromise。 - 当HMR触发模块重载时,新的模块实例会先检查
global._mongoClientPromise是否存在——如果存在,就直接复用这个已有的连接Promise,无需重新创建MongoClient连接。
你觉得项目里没访问过global._mongoClientPromise,是因为读取它的代码就在这段赋值逻辑的上方:
if (!global._mongoClientPromise) { client = new MongoClient(uri, options); global._mongoClientPromise = client.connect(); } clientPromise = global._mongoClientPromise;
为什么用global就能保留值?因为Node.js的global对象是进程级全局变量,不受模块热重载影响——HMR只会重新加载模块自身代码、重置模块内局部变量,但全局变量会在整个进程生命周期中持续存在。这样就能避免开发时修改代码后频繁创建新的MongoDB连接,防止资源浪费和连接数超限。
内容的提问来源于stack exchange,提问作者muell
相关产品推荐
相关产品推荐

