NextJS中Redux thunk调用位置:getInitialProps还是客户端useEffect?
Next.js + Redux 非交互类请求的最佳实践解答
1. 非交互类首屏请求不推荐在useEffect中dispatch thunk
你担心的问题完全成立:useEffect只会在客户端hydration完成后执行,服务端渲染阶段不会触发,放在这里拉首屏数据等于完全放弃Next.js的SSR/SSG优势,返回的HTML首屏没有实际内容,和纯客户端渲染的React应用没有区别,既影响首屏加载速度,也不利于SEO。
2. 首屏请求的正确放置位置
优先根据你的页面渲染策略选择对应的服务端数据获取函数:
- 如果页面内容不常更新,优先用
getStaticProps(SSG静态生成),构建时就拉取数据生成静态HTML,性能最好 - 如果页面内容需要每次请求动态更新,用
getServerSideProps(SSR服务端渲染) - 不推荐优先用
getInitialProps,它会强制整个页面走服务端渲染,无法享受静态优化,仅在有特殊跨页面全局数据获取需求时考虑使用
你完全可以在上述服务端函数中直接调用接口获取数据,不需要在这里dispatch thunk,拿到数据后直接作为props返回给页面组件即可。
3. 服务端获取的数据同步到Redux的方案
不需要引入next-redux-wrapper也能实现状态同步,完全可以避免冗余的样板代码:
你只需要在页面组件初始化时,将服务端注入的props数据直接dispatch到Redux store即可,参考逻辑如下:
// 页面服务端数据获取 export const getServerSideProps = async () => { const apiRes = await fetch('你的接口地址') const initialData = await apiRes.json() return { props: { initialData } } } // 页面组件逻辑 const DemoPage = ({ initialData }) => { const dispatch = useAppDispatch() // 初始化时将服务端预取的数据存入store useEffect(() => { dispatch(initGlobalState(initialData)) }, [dispatch, initialData]) // 后续有客户端更新需求时再复用thunk逻辑即可 const refreshData = () => dispatch(fetchNewDataThunk()) return <>{/* 页面渲染逻辑 */}</> }
这种方案既保留了Next.js的服务端渲染优势,也复用了Redux的状态管理能力,没有额外的库依赖,样板代码量也非常少。
4. 什么情况适合在客户端dispatch非交互类thunk
只有当你的数据不需要参与服务端渲染(比如用户个性化的非公开内容、对SEO无要求的后台系统页面),或者是首屏渲染完成后需要懒加载的非关键路径数据,才推荐在客户端的useEffect中dispatch thunk拉取。
内容的提问来源于stack exchange,提问作者Karan Kumar
相关产品推荐
相关产品推荐

