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

NextJS开发模式下模块重复加载致缓存重置问题求助

Next.js开发模式下模块重复加载导致缓存重置的原因与解决方法

核心原因

开发模式下每次请求都触发模块重新加载,本质是Next.js为了支持**热模块替换(HMR)**和实时代码更新,对服务器端模块的加载逻辑做了特殊处理:

  • 生产环境中,服务器启动时模块只会加载一次,模块级变量(比如stateMap)会常驻内存;但开发模式下,API路由、中间件这类处理请求的代码,每次请求都会重新解析执行依赖的模块,导致模块内的缓存对象被重新初始化。
  • 中间件的加载逻辑更特殊:开发模式下中间件每次请求都会重新运行,它依赖的所有模块也会被重新加载,这就是你看到***Stupid module is loading again!****每次请求都打印的原因。

解决方法

1. 用Node.js全局对象持久化缓存

把缓存挂载到global对象上,模块重新加载时全局对象的属性不会被重置,适合自定义缓存场景:

import ExpiryMap from 'expiry-map';

// 复用全局对象上的缓存,不存在则初始化
const stateMap = (global as any).stateMap || new ExpiryMap(180000, []);
(global as any).stateMap = stateMap;

export default async function RedirectToCognitoAuthorization(subdomain: string) {
  const state = '12345';
  stateMap.set(state, 'abcde');
  console.log(stateMap.size);
}

2. 用Next.js官方缓存API处理数据加载

对于从数据库加载记录的场景,用Next.js提供的缓存能力替代自定义模块级缓存,更符合框架设计:

import { unstable_cache } from 'next/cache';

// 缓存数据库查询结果,设置有效期
const fetchDatabaseRecords = unstable_cache(async () => {
  // 替换成你的数据库查询逻辑
  return await db.query('SELECT * FROM your_table');
}, ['unique-cache-key'], {
  revalidate: 3600, // 缓存1小时,可按需调整
});

export async function getRecords() {
  return await fetchDatabaseRecords();
}

3. 临时禁用热更新(不推荐)

如果不需要实时代码刷新,可以启动开发服务器时加--no-hmr参数,但修改代码后需要手动重启,会影响开发效率:

npm run dev -- --no-hmr

内容的提问来源于stack exchange,提问作者Gus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:52:41