为何next-redux-wrapper在redux-logger中触发两次_NEXT_REDUX_WRAPPER_HYDRATE_?
Next.js + next-redux-wrapper 服务端/客户端 Hydrate 概念与重复触发问题解答
先理清Hydrate的核心逻辑
- 服务端渲染时,Next.js会在服务端生成页面HTML,同时把当前Redux store的状态序列化后注入到页面的
window.__NEXT_DATA__中 - 客户端启动时,会读取这个服务端注入的状态,通过
NEXT_REDUX_WRAPPER_HYDRATE动作,把服务端状态同步到客户端Redux store里,这个过程就是Hydrate(水化)——目的是让客户端状态和服务端完全一致,避免页面内容与状态不匹配导致的闪烁或错误
关于NEXT_REDUX_WRAPPER_HYDRATE触发两次的情况
即使关闭了reactStrictMode,这种情况在部分场景下属于正常行为,常见原因包括:
- 第一次Hydrate:客户端初始化阶段的基础同步,把服务端预渲染的初始状态同步到客户端store
- 第二次Hydrate:如果你使用了RTK Query这类异步数据工具,它在客户端启动时会和服务端的缓存状态做二次校验同步,触发额外的Hydrate动作。从你的日志来看,第二次Hydrate刚好发生在
api/executeQuery/pending之后,符合RTK Query的内部状态同步逻辑
如何判断是否是代码问题
- 检查Hydrate reducer的处理逻辑:确保在处理
NEXT_REDUX_WRAPPER_HYDRATE动作时,是合并服务端状态而非直接覆盖。比如使用Redux-Toolkit的createReducer时,正确处理payload:extraReducers: (builder) => { builder.addCase(NEXT_REDUX_WRAPPER_HYDRATE, (state, action) => { // 合理合并状态,而非直接替换 return { ...state, ...action.payload, // 对异步数据模块做特殊处理,比如保留客户端最新请求状态 api: { ...state.api, ...action.payload.api } }; }); } - 确认页面状态是否正常:如果页面没有出现闪烁、数据重复加载、状态异常(比如数据丢失或重复),那两次Hydrate就是工具内部的正常同步,无需修复
- 检查依赖版本:确保
next-redux-wrapper和@reduxjs/toolkit使用的是最新稳定版,旧版本可能存在重复触发Hydrate的bug
内容的提问来源于stack exchange,提问作者tommychoo
相关产品推荐
相关产品推荐

