15
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

00. styled-componentsとは

styled-componentsはReact向けに作られたCSS in JSライブラリの一つです。スタイルをJavaScript内で定義し、コンポーネントごとにスタイルを管理できるため、スタイルの重複や競合を防ぎやすくなります。
本記事ではNext.jsでstyled-componentsを使用するための初期設定の方法を記します。

01. styled-componentsのインストール

まずは対象のプロジェクト内で以下コマンドを実行し、パッケージをインストールします。

$ npm install --save styled-components

今回はTypeScriptを使用するため型定義の@types/styled-componentsもインストールします。

$ npm install --save-dev @types/styled-components

02. next.config.mjsの設定

next.config.mjsのファイルに以下の設定を追加し、compilerオプションのstyled-componentsを有効化します。

/** @type {import('next').NextConfig} */
const nextConfig = {
  reactStrictMode: true,
  //以下を追加
  compiler: {
    styledComponents: true,
  },
};

export default nextConfig;

03. サーバーサイドレンダリングのサポート設定

SSRやSSGを使用する際に、サーバーサイドでスタイルを適用させるための設定が必要です。これにより、ページの初回読み込み時に正しくスタイルが適用されるようになります。pages/_document.tsxファイルを作成し、以下の設定を追加します。

import Document, { DocumentContext } from 'next/document';
import { ServerStyleSheet } from 'styled-components';

// デフォルトのDocumentクラスを拡張してカスタムDocumentクラスを作成
export default class MyDocument extends Document {
  static async getInitialProps(ctx: DocumentContext) {
    const sheet = new ServerStyleSheet();
    const originalRenderPage = ctx.renderPage;

    try {
      // Appコンポーネントをラップし、スタイルを収集
      ctx.renderPage = () =>
        originalRenderPage({
          enhanceApp: (App) => (props) => sheet.collectStyles(<App {...props} />),
        });

      // 初期プロパティを取得
      const initialProps = await Document.getInitialProps(ctx);

      // initialPropsにスタイルを追加して返す
      return {
        ...initialProps,
        styles: (
          <>
            {initialProps.styles}
            {sheet.getStyleElement()}
          </>
        ),
      };
    } finally {
      sheet.seal();
    }
  }
}

準備はこれで完了です。

04. 実際に書いてみる

試しにpages/index.tsxでstyled-componentsを使ってみます。

//書式
styled.要素名`スタイル`

styled.要素名で要素を指定し、直後のテンプレート文字列の中でスタイルを定義します。
以下でh1要素にスタイルを適用したTitleコンポーネントを定義します。

import type { NextPage } from 'next';
import styled from 'styled-components';

const Title = styled.h1`
  color: red;
`;
const Home: NextPage = () => {
  return (
    <div>
      <Title>Hello World</Title>
    </div>
  );
}

export default Home;

サーバーを起動し、ブラウザで確認するとスタイルの適用が確認できます。
スクリーンショット 2024-07-08 121644.jpg

以上でNext.jsでのstyled-componentsの導入設定は完了です。

参考記事一覧

15
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?