#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. Большое спасибо, я не знаю, откуда вы взяли этот ответ, но вы спасли мне жизнь.