<style global jsx /> 似乎没有应用

Posted

技术标签:

【中文标题】<style global jsx /> 似乎没有应用【英文标题】:<style global jsx /> doesn't seem to be applied 【发布时间】:2019-12-03 23:00:34 【问题描述】:

我有自定义的_document 文件,其内容如下。由于某些原因,&lt;style global jsx /&gt; 中指定的样式似乎并未应用于第一次渲染。在开发中,当我刷新页面时它们会被应用,但是当我为静态导出构建网站时,即使刷新后它们也不会应用。

import  ServerStyleSheets  from '@material-ui/styles';
import Document,  Head, Main, NextScript  from 'next/document';
import React,  Fragment  from 'react';

class MyDocument extends Document 
  static async getInitialProps(ctx) 
    const sheets = new ServerStyleSheets();
    const originalRenderPage = ctx.renderPage;

    ctx.renderPage = () =>
      originalRenderPage(
        enhanceApp: App => props => sheets.collect(<App ...props />)
      );

    const initialProps = await Document.getInitialProps(ctx);

    return 
      ...initialProps,
      styles: (
        <Fragment>
          initialProps.styles
          sheets.getStyleElement()
        </Fragment>
      )
    ;
  

  render() 
    return (
      <html lang="en">
        <Head>
          <link
            href="https://fonts.googleapis.com/css?family=Nunito+Sans:400,600,700&display=swap"
            rel="stylesheet"
          />

          <style global jsx>`
            html 
              font-size: 16px;
            

            a 
              text-decoration: none;
            

            #__next 
              position: relative;
              display: flex;
            

            #__next-prerender-indicator 
              display: none;
            
          `</style>
        </Head>
        <body>
          <Main />
          <NextScript />
        </body>
      </html>
    );
  


export default MyDocument;

【问题讨论】:

我认为是&lt;style jsx global&gt; 标签而不是&lt;style global jsx&gt; 似乎不是问题,位置改变的行为相同 检查这个 - github.com/zeit/next.js/wiki/Global-styles-and-layouts 还有这个 - github.com/zeit/styled-jsx#global-styles 【参考方案1】:

您应该将全局样式添加到_app。至于为什么它在_document 中不起作用,请查看https://github.com/zeit/styled-jsx#server-side-rendering

我不确定它是否会起作用,但你可以做

import Document,  Html, Head, Main, NextScript  from 'next/document';
import flush from 'styled-jsx/server';

class MyDocument extends Document 
  static async getInitialProps (ctx) 
    const initialProps = await Document.getInitialProps(ctx)
    initialProps.styles = flush()
    return  ...initialProps 
  

  render() 
    return (
      <Html>
        <Head>
          <link
            href="https://fonts.googleapis.com/css?family=Nunito+Sans:400,600,700&display=swap"
            rel="stylesheet"
          />

          <style global jsx>`
            html 
              font-size: 16px;
            

            a 
              text-decoration: none;
            

            #__next 
              position: relative;
              display: flex;
            

            #__next-prerender-indicator 
              display: none;
            
          `</style>
        </Head>
        <body>
          <Main />
          <NextScript />
        </body>
      </Html>
    );
  



export default MyDocument;

【讨论】:

您应该将全局样式添加到 _app - 这是正确的答案!谢谢@evgeni fotia!

以上是关于<style global jsx /> 似乎没有应用的主要内容,如果未能解决你的问题,请参考以下文章

标签错误:渲染时出现 React JSX 样式标签错误

在 VSCode 中为 JSX 配置 Emmet

JSX 中的 SVG - 如何转换 defs 标签

sciter jsx 组件化编程

Vue中jsx的最简单用法

react知识总结