警告:Prop `className` 在 Next.JS 站点中与样式化组件不匹配

IT技术 reactjs next.js styled-components
2021-04-07 07:01:13

我在 Stack Overflow 上搜索过类似的问题,但答案要么是指旧版本,要么与我的情况无关。

对于使用样式组件的页面上的第一个组件,我收到上述错误。如果我删除该组件,我会收到下一个组件的错误,依此类推,所以我假设水化过程存在问题,并且每个 className 都会发生这种情况。

我有一个_document.tsx文件,它扩展了 Document 类并具有以下 getInitialProps 函数

static async getInitialProps (ctx) {

    const sheet = new ServerStyleSheet()
    const originalRenderPage = ctx.renderPage

    try {

        ctx.renderPage = () =>
            originalRenderPage({
            enhanceApp: App => props => sheet.collectStyles(<App {...props} />)
        })

        const initialProps = await Document.getInitialProps(ctx)
        
        return {
            ...initialProps,
            styles: (
                <>
                    {initialProps.styles}
                    {sheet.getStyleElement()}
                </>
            )
        }
        
    } finally {
        sheet.seal()
    }
    
}

我的预感是这与此代码有关,因为在我升级到 Typescript(并且不得不更改我的 _app.tsx 文件)之前,我没有收到此错误,但我不知道如何修复它。

任何帮助将不胜感激。

1个回答

尝试安装babel-plugin-styled-components,然后.babelrc使用以下配置文件添加到项目的根目录。这确保在再水化期间不会发生类生成中的不匹配。

{
    "presets": ["next/babel"],
    "plugins": [["styled-components", { "ssr": true }]]
}

babel-plugin-styled-components的文档中

通过为每个样式组件添加唯一标识符,该插件避免了由于客户端和服务器上的类生成不同而导致的校验和不匹配。如果你不使用这个插件并尝试在服务器端渲染样式化组件,React 会在重新水化期间抱怨 HTML 属性不匹配警告。

是的,你_document.tsx在我看来很好。
2021-05-24 07:01:13
@decryptingfuture 看起来 Next.js 团队计划将此插件移植到 SWC 编译器:github.com/vercel/next.js/issues/30802在那之前,我猜你会被 Babel 困住。
2021-06-07 07:01:13
好的,我会试试的。我是否仍然需要保留 _document.tsx 文件中的所有内容?
2021-06-11 07:01:13
swc 编译器有什么更新吗?
2021-06-15 07:01:13
只是为了添加,我添加了一个 .babelrc 文件,而不是 Babel.config.json
2021-06-16 07:01:13