NextJS с быстрым обновлением стилизованных компонентов не работает
У меня есть приложение NextJS, которое используется со стилизованными компонентами.
У меня есть эти 3 файла: Стоит отметить, что некоторые пометки удалены для ясности, поэтому вставляются только соответствующие коды.
Header.js
import {
HeaderContainer,
SearchInput,
SearchWrapper
} from './HeaderStyles';
import { Input } from '../GlobalComponents/GlobalComponents';
const Header = () => {
return (
<HeaderContainer>
<SearchWrapper>
<SearchInput type='text' placeholder='Search movie' />
</SearchWrapper>
</HeaderContainer>
);
}
export default Header;
import styled from 'styled-components';
import { Input } from '../GlobalComponents/GlobalComponents';
export const HeaderContainer = styled.header`
background-color: ${props => props.theme.colors.primary};
display: flex;
align-items: center;
box-sizing: border-box;
`;
export const SearchWrapper = styled.div`
flex-grow: 3;
background-color: red;
`;
export const SearchInput = styled(Input)`
background-color: yellowgreen;
`;
import styled from "styled-components";
export const Input = styled.input`
padding: 1rem;
`;
Прилагается структура моего проекта
Обратите внимание, что внутри
SearchInput
распространяется из всякий раз, когда я меняю свойства css в
HeaderStyles.js
, быстрое обновление работает нормально. Однако в случае
GlobalComponents.js
, мне пришлось вручную перезагрузить страницу, чтобы просмотреть изменения.
Если бы я поместил свой общий
Input
стиль в
HeaderStyles
, он отлично работает, но я не хотел его структурировать. Так что я предполагаю, что это связано с тем, что импортированные модули не находятся в дереве React или что-то в этом роде.
Я искал решения в Интернете, но мне не повезло. Хотелось бы узнать причины и пути решения. Спасибо в рекламе.
5 ответов
Я думаю, что ваша проблема со стилизованным компонентом в SSR.
Вы можете попробовать изменить свои страницы/_document.js и конфигурацию Babel.
добавьте эти коды в .babelrc
{
"presets": ["next/babel"],
"plugins": [["styled-components", { "ssr": true }]]
}
_document.js
https://github.com/vercel/next.js/blob/main/examples/with-styled-components/pages/_document.js
с Next Complier в новой версии next вам нужно только обновить файл next.config и файл _document, и все будет готово. Babel вызовет конфликт с компилятором NextJS.
https://github.com/vercel/next.js/tree/canary/examples/with-styled-components
У меня была такая же проблема.
Сначала вам нужно установить этот пакет:
npm install --save-dev babel-plugin-styled-components
Затем вы создаете файл в корне каталога вашего проекта с именем «babel.config.js». В этот файл вы включаете следующее:
module.exports = {
presets: ["next/babel"],
plugins: [["styled-components", { ssr: true }]]
};
Проблема связана с Next JS, и для ее решения вам нужно всего лишь добавить этот код в _document.tsx или _document.js, и она будет решена.
import Document, { DocumentContext } from "next/document";
import { ServerStyleSheet } from "styled-components";
export default class MyDocument extends Document {
static async getInitialProps(ctx: DocumentContext) {
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();
}
}
}
Убедитесь, что у вас естьpages/_document.js
с кодами, указанными здесь .