Css 通用呈现在DOMContentLoaded事件和Load事件之间创建延迟
我对样式化组件非常兴奋,如果不是因为这个,我很想使用它…Css 通用呈现在DOMContentLoaded事件和Load事件之间创建延迟,css,reactjs,styled-components,next.js,universal-react,Css,Reactjs,Styled Components,Next.js,Universal React,我对样式化组件非常兴奋,如果不是因为这个,我很想使用它… 我使用next.js通用渲染库准备了两个示例项目。 第一个示例使用样式化组件作为解决方案,第二个示例使用css的默认解决方案,即样式化jsx。 这两个示例都包含完全相同的代码,复杂性最低。 您很快就会看到,在styled components示例中,DOMContentLoaded事件和Load事件之间存在令人不安的延迟,用户在这两个事件中实际看到了未设置样式的html标记,而在使用styled jsx的第二个示例中,情况并非如此 两个演
我使用next.js通用渲染库准备了两个示例项目。
第一个示例使用样式化组件作为解决方案,第二个示例使用css的默认解决方案,即样式化jsx。
这两个示例都包含完全相同的代码,复杂性最低。 您很快就会看到,在styled components示例中,DOMContentLoaded事件和Load事件之间存在令人不安的延迟,用户在这两个事件中实际看到了未设置样式的html标记,而在使用styled jsx的第二个示例中,情况并非如此 两个演示都使用Zeit now在线托管:
1-
2- github上提供的源代码:
1-
2- 我非常感谢任何关于为什么它发生在其中一个而不是另一个的见解, 当然,还有任何修改这种行为的方法,因为我喜欢使用样式化组件,因为它有很多特性和优点 谢谢你
半开的
:)这里缺少的是服务器上的样式注入。基本上,当您使用JavaScript编写样式时,您必须在服务器上获取生成的样式,并将它们作为
style
标记注入到生成的HTML中
Next的内置解决方案会自动为您实现这一点,使用样式化组件
,您需要做一点手动工作,并添加一个pages/\u document.js
文件,如下所示:
import Document, { Head, Main, NextScript } from 'next/document'
import { styleSheet } from 'styled-components'
export default class MyDocument extends Document {
static async getInitialProps ({ renderPage }) {
const page = renderPage()
const styles = (
<style dangerouslySetInnerHTML={{ __html: styleSheet.rules().map(rule => rule.cssText).join('\n') }} />
)
return { ...page, styles }
}
render () {
return (
<html>
<Head>
<title>My page</title>
</Head>
<body>
<Main />
<NextScript />
</body>
</html>
)
}
}
从'next/Document'导入文档,{Head,Main,NextScript}
从“样式化组件”导入{styleSheet}
导出默认类MyDocument扩展文档{
静态异步getInitialProps({renderPage}){
const page=renderPage()
常量样式=(
rule.cssText.join('\n')}/>
)
返回{…页面,样式}
}
渲染(){
返回(
我的页面
)
}
}
注意我们是如何使用
样式化组件中的样式注入样式标记的。这就是它的全部,现在,未格式化内容的闪光消失了 以下是将样式化组件与next一起使用以避免问题的建议方法:
从“下一个/文档”导入文档
从“样式化组件”导入{ServerStyleSheet}
导出默认类MyDocument扩展文档{
静态异步getInitialProps(ctx){
const sheet=new ServerStyleSheet()
const originalRenderPage=ctx.renderPage
试一试{
ctx.renderPage=()=>
原始渲染图({
增强应用程序:(应用程序)=>(道具)=>
sheet.collectStyles(),
})
const initialProps=wait Document.getInitialProps(ctx)
返回{
…初始道具,
风格:(
{initialProps.style}
{sheet.getStyleElement()}
),
}
}最后{
页.印章()
}
渲染(){
返回(
我的页面
)
}
}
import Document from 'next/document'
import { ServerStyleSheet } from 'styled-components'
export default class MyDocument extends Document {
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()
}
render () {
return (
<html>
<Head>
<title>My page</title>
</Head>
<body>
<Main />
<NextScript />
</body>
</html>
)
}
}