Next.js, Styled-компоненты и повтор сеанса Яндекс Метрики
Я работаю над проектом, использующим Next.js и стилизованные компоненты. В моем файле [slug].tsx:
export default function ProductDetails({ product }: IProductDetailsProps) {
const router = useRouter();
if (router.isFallback) {
return (
<LoadingContainer>
<ReactLoading color="#000" type="bubbles" />
</LoadingContainer>
);
}
return (
<>
{product._id ? (
<>
<Header />
<Container>
<ProductPath>
<Link href="/">Home</Link>
<Link href="/shop">Shop</Link>
{product.categoryId && (
<Link href={`/shop/${product.categoryId.slug}`}>
{product.categoryId.name}
</Link>
)}
<span>{product.name}</span>
</ProductPath>
<ProductInfo product={product} />
</Container>
</>
) : (
<Error>An unexpected error has occurred.</Error>
)}
</>
);
}
Большинство тегов взяты из стилизованных компонентов, например:
export const LoadingContainer = styled.div`
display: flex;
align-items: center;
justify-content: center;
width: 100vw;
height: 100vh;
`;
export const Error = styled.div`
display: flex;
align-items: center;
justify-content: center;
width: 100vw;
height: 100vh;
`;
export const Container = styled.div``;
export const ProductPath = styled.p`
display: block;
padding: 22px 32px;
font-size: 14px;
background-color: #f1f1f1;
a {
text-decoration: none;
color: #09c;
transition: color 0.2s;
&:hover {
color: #fcb800;
}
}
a + a::before,
a + span::before {
content: '/';
color: #000;
cursor: auto;
margin: 0 10px;
}
`;
Я следил за документами по стилизованным компонентам для Next.js ( https://styled-components.com/docs/advanced#nextjs ), моим .babelrc:
{
"presets": ["next/babel"],
"plugins": [["styled-components", { "ssr": true }]]
}
_document.tsx:
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();
}
}
}
Этот проект требует, чтобы Yandex Session Replay работал, но когда мое приложение загружается в продакшене, в консоли нет ошибок, и Yandex Session Replay не отображает CSS:
воспроизведение сеанса не отображает CSS
Какие-либо предложения?
Спасибо.
1 ответ
попробуйте добавить функцию рендеринга внутри компонента _document следующим образом:
import Document, {
Html,
Head,
Main,
NextScript,
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()
}
}
render() {
return (
<Html>
<Head />
<body>
<Main />
<NextScript />
</body>
</Html>
)
}
}