LoginSignup
5
3

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-09-06

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

Create React App実行

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

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

Emotion追加

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

npm i @emotion/react

スタイルを当てる

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

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

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

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

JSX Pragmaの記述が必要です。

JSX Pragmaの記述

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

/** @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環境の設定をカスタマイズするためのライブラリです。

まず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.jsonscriptsを以下のように変更します。
この変更により、CRACOを通じてビルド等ができるようになります。

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

最後にtsconfig.jsoncompilerOptionsに以下を追記します。

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

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

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;

参考

5
3
1

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
5
3