Предупреждение: Реквизит «Имя класса» не совпал в Next.JS сайт со стилизованными компонентами

#next.js #styled-components

Вопрос:

Я искал переполнение стека для подобных вопросов, но ответы либо относятся к старым версиям, либо не имеют отношения к моей ситуации.

Я получаю вышеуказанную ошибку для первого компонента на странице, который использует стилизованные компоненты. Если я удалю этот компонент, я получу ошибку для следующего и так далее, поэтому я предполагаю, что есть проблема с процессом увлажнения, и это происходит для каждого имени класса.

У меня есть файл _document.tsx, который расширяет класс документа и имеет следующую функцию 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. Не могли бы вы также опубликовать свой .babelrc файл, пожалуйста?

2. Файла .babelrc нет, Next его не добавляет.

Ответ №1:

Попробуйте установить babel-plugin-styled-components , затем добавьте .babelrc файл в корневой каталог проекта со следующей конфигурацией. Это гарантирует, что во время регидратации не произойдет несоответствий в генерации классов.

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

Из babel-plugin-styled-components документации:

Добавляя уникальный идентификатор к каждому стилизованному компоненту, этот плагин позволяет избежать несоответствий контрольной суммы из-за создания разных классов на клиенте и на сервере. Если вы не используете этот плагин и попытаетесь выполнить рендеринг в стиле на стороне сервера, компоненты React будут жаловаться с предупреждением о несоответствии атрибутов HTML во время регидратации.

Комментарии:

1. Хорошо, я попробую это сделать. Нужно ли мне по-прежнему оставлять все как есть в моем файле _document.tsx?

2. Просто чтобы добавить, я добавил файл .babelrc, а не Babel.config.json

3. @decryptingfuture Выглядит как Next.js команда планирует перенести этот плагин в компилятор SWC: github.com/vercel/next.js/issues/30802 . А до тех пор, я думаю, ты застрял с Вавилоном.

4. Спасибо, это помогло решить мою проблему! github.com/vercel/next.js/tree/canary/examples/…

5. Я читал это Next.js часть документации, поэтому часть подключения я уже пробовал, но она выдала синтаксическую ошибку: Неожиданный токен, так как в моем проекте был машинописный текст. Часть, которая сделала трюк, заключалась в следующем: «предустановки»: [«следующий/babel»], а не только часть плагинов, как указано в документации, которую вы должны включить в свой файл .babelrc. Большое спасибо, я не знаю, откуда вы взяли этот ответ, но вы спасли мне жизнь.