概要
CRA(Create React App)で作成したReactプロジェクトと、Next.jsプロジェクトそれぞれに対して、emotion/reactの導入方法をまとめました。
どちらもゴールは、.tsxファイルに以下のプラグマを書かなくて済む設定にすることです。
/** @jsx jsx */
/** @jsxImportSource @emotion/react */
emotionは、CSS in JS記法で書くスタイリングパッケージです。
CRA(Create React App)への導入
以下の記事の抜粋になっています。
パッケージについて詳しく知りたい方は、こちらも併せて参照してください。
プロジェクト作成
適当なプロジェクトフォルダを作成して、以下を実行します。
npx create-react-app . --template typescript --use-npm
パッケージインストール
以下をインストールします。
npm i @emotion/react
npm i -D @emotion/babel-plugin
npm i @craco/craco
tsconfig.json
設定を追加します。
"compilerOptions": {
	"jsxImportSource": "@emotion/react"
}
craco.config.js
ルート直下にcraco.config.jsを作成して、以下を記述します。
module.exports = {
  babel: {
    presets: [
      [
        "@babel/preset-react",
        { runtime: "automatic", importSource: "@emotion/react" },
      ],
    ],
    plugins: ["@emotion/babel-plugin"],
  },
};
package.json
内容を修正します。
"scripts": {
	"start": "craco start",
	"build": "craco build",
	"test": "craco test"
}
動作確認
cssプロパティが使用できて、デバッグ(npm start)したときと、ビルド(npm run build → serve -s build)したときにスタイルが反映されていればOKです。
import React, { VFC } from 'react';
import { css } from '@emotion/react';
export const App: VFC = () => {
	return (
		<div css={styles.container}>
			<div css={styles.text}>Hello</div>
		</div>
	)
}
const styles = {
	container: css`
		position: relative;
		width: 100vw;
		height: 100vh;
		background-color: #1e1e1e;
		display: flex;
		justify-content: center;
		align-items: center;
	`,
	text: css`
		font-size: 5rem;
		color: #fff;
	`
}
Next.js への導入
以下の記事の抜粋になっています。
パッケージについて詳しく知りたい方は、こちらも併せて参照してください。
プロジェクト作成
適当なプロジェクトフォルダを作成して、以下を実行します。
npx create-next-app . --ts --use-npm
パッケージインストール
以下をインストールします。
npm i @emotion/react
npm i -D @emotion/babel-plugin
tsconfig.json
設定を追加します。
"compilerOptions": {
	"jsxImportSource": "@emotion/react"
}
.babelrc
ルート直下に**.babelrc**を作成して、以下を記述します。
{
  "presets": [
    [
      "next/babel",
      {
        "preset-react": {
          "runtime": "automatic",
          "importSource": "@emotion/react"
        }
      }
    ]
  ],
  "plugins": ["@emotion/babel-plugin"]
}
動作確認
cssプロパティが使用できて、デバッグ(npm run dev)したときと、ビルド(npm run build → npm start)したときにスタイルが反映されていればOKです。
コードはCRAの場合と重複するので割愛します。
補足:nth-child を使う場合
nth-childを使う場合、さらに追加で設定が必要になるようです。
ここでは取り上げませんが、設定方法を知りたい方は、以下の記事を参考にしてください。
