Next jsでスタイル化コンポーネントclassNameが一致しない場合

8759 ワード

  • _document.ts
  • import Document, {
      DocumentContext,
      DocumentInitialProps,
      Html,
      Main,
      Head,
      NextScript,
    } from "next/document";
    import { ServerStyleSheet } from "styled-components";
    
    export default class MyDocument extends Document {
      static async getInitialProps(
        ctx: DocumentContext
      ): Promise<DocumentInitialProps> {
        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(): JSX.Element {
        return (
          <Html lang="ko">
            <Head />
            <body>
              <Main />
              <NextScript />
            </body>
          </Html>
        );
      }
    }
  • babel rc
  • {
        "presets": [
            "next/babel"
        ],
        "plugins": [
            [
                "babel-plugin-styled-components",
                {
                    "fileName": true,
                    "displayName": true,
                    "pure": true
                }
            ]
        ]
    }
    filename:コードを含むファイル名を通知する
    displayName:クラス名にスタイル情報を追加する
    pure:未使用の属性を削除する