next-i18next使用getStaticProps时页面加载后_app.js重复渲染原因咨询
next-i18next场景下getStaticProps触发_app.js重新调用的原因
- Next.js原生props传递机制:Next.js框架设计中,所有页面的
getStaticProps返回值都会作为pageProps属性整体传递给顶层_app.js组件。只要getStaticProps执行完毕返回新的对象(哪怕内容和之前完全相同,只是引用地址变化),pageProps的引用就会更新,进而触发_app.js的重渲染,该逻辑和是否使用next-i18next无关,next-i18next的注入行为只是让这个现象更容易被观测到。 - next-i18next的属性注入逻辑:next-i18next提供的
serverSideTranslations方法会在getStaticProps执行阶段拉取对应语言的翻译资源,向返回的props中注入_nextI18Next配置、当前locale、翻译字典等专属属性。每次getStaticProps运行时serverSideTranslations都会生成新的对象引用,进一步保证了pageProps的引用变更,必然触发_app.js重新调用。 - 全局上下文更新触发重渲染:next-i18next会在
_app.js层面挂载I18n全局上下文Provider,当getStaticProps返回的翻译内容、语言配置发生实际变化时,全局上下文会更新,进而触发整个App组件树的重新渲染。 - 增量静态再生的额外触发:如果页面配置了增量静态再生(ISR,即
getStaticProps中配置了revalidate参数),每次ISR触发页面重新生成时,getStaticProps都会重新运行拉取最新翻译数据,新的props传递到_app.js时也会触发重新调用。
如果需要减少不必要的重渲染,可以通过React.memo包裹_app.js的导出组件,自定义比较逻辑过滤无意义的props引用变更,仅在必要的全局属性(如用户状态、全局配置)变化时才触发重渲染。
内容的提问来源于stack exchange,提问作者Avichay Dahan
相关产品推荐
相关产品推荐

