Create React Appで作成したReact環境にEmotionを導入する手順

EmotionとはCSS in JSのフレームワークです。
Create React Appで作成したReact環境にEmotionを導入する手順をまとめます。

## Create React App実行
まずは以下のコマンドを実行して、Reactの環境を構築します。

```
npx create-react-app プロジェクト名 --template typescript
```

## Emotion追加

https://emotion.sh/docs/introduction#react

公式に従って、以下のコマンドでEmotionを追加します。

```
npm i @emotion/react
```

## スタイルを当てる

1. @emotion/reactから`css`をインポート

1. 当てたいスタイルを記述

1. 記述したスタイルを当てる

```tsx
import React from 'react';
import logo from './logo.svg';
import './App.css';
import { css } from '@emotion/react';  // 1

// 2
const link = css`
  background-color: red;
` 

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.tsx</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
          css={link}  // 3
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default App;
```

しかしこれだけだと以下のようなエラーが表示され、スタイルを当てることができないため設定を追加します。

![スクリーンショット 2022-09-03 11.26.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633215/90e14f12-5ee4-cb86-7221-902bd81bafeb.png)

JSX Pragmaの記述が必要です。

## JSX Pragmaの記述

https://emotion.sh/docs/css-prop#jsx-pragma

公式に従って、Emotionを使いたいファイルに`/** @jsxImportSource @emotion/react */`と記述します。

```tsx
/** @jsxImportSource @emotion/react */
import React from 'react';
import logo from './logo.svg';
import './App.css';
import { css } from '@emotion/react';
省略
```

これでEmotionを使って、スタイルを当てることができます。

## いちいちJSX Pragmaを記述するのが面倒な場合

CRACOを追加することで、面倒を省くことができます。

CRACOはReact環境の設定をカスタマイズするためのライブラリです。

https://www.npmjs.com/package/@craco/craco

まずCRACOをインストールします。

```
npm i @craco/craco
```

続いてプロジェクトの直下に、`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`を以下のように変更します。
この変更により、CRACOを通じてビルド等ができるようになります。

```package.json
"scripts": {
    "start": "craco start",
    "build": "craco build",
    "test": "craco test",
}
```

最後に`tsconfig.json`の`compilerOptions`に以下を追記します。

```tsconfig.json
"compilerOptions": {
   "jsxImportSource": "@emotion/react"
}
```

以上で`/** @jsxImportSource @emotion/react */`と記述しなくても、Emotionでスタイルを当てることができます。

```tsx
import React from 'react';
import logo from './logo.svg';
import './App.css';
import { css } from '@emotion/react';

const link = css`
  background-color: red;
` 

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.tsx</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
          css={link}
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default App;
```

## 参考

https://emotion.sh/docs/introduction#react

https://emotion.sh/docs/css-prop#jsx-pragma

https://ramble.impl.co.jp/1414/