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
相关产品推荐
相关产品推荐

