一般社団法人 全国個人事業主支援協会

COLUMN コラム

はじめに

こんにちわ。都内でフリーランスエンジニアをしております。大城です。

本記事ではcreate-react-app(※以下cra)で作成したプロジェクトにemotionを導入してJSX Pragmaを使用せずcss propを有効にする方法を紹介します。

また各ツールの説明は省くので、webpack等々ある程度の知識がある方が対象です。

バージョン

  • ・create-react-app 5.0.1

  • react 18.2.0

  • @emotion/react 11.9.3

手順

プロジェクトの作成

まずはcreate-react-appを叩いてプロジェクトを作成します。templateにはtypescriptを指定します。

$ npx create-react-app sample-project --template typescript

$ cd sample-project

必要なパッケージのインストール

今回はnpm ejectを使用せずにcraの基本構成をオーバーライドする形でemotionを導入するため、オーバーライドに必要な以下をパッケージをインストールします

  • react-app-rewired
  • customize-cra

$ npm install react-app-rewired customize-cra –save-dev

config-overrides.jsの作成

npm scriptsをreact-scripsからreact-app-rewiredに移行するため、実行に必要なconfig-overrides.jsファイルをプロジェクトルートに作成し、以下を記述してBabelの上書きを有効にします。

const { override, useBabelRc } = require("customize-cra");

module.exports = override(useBabelRc());
そして、package.jsonのnpm scriptsを以下の様に書き換えます。
"scripts": {
  "start": "react-app-rewired start",
  "build": "react-app-rewired build",
  "test": "react-app-rewired test",
  "eject": "react-app-rewired eject"
},

これでBabelの設定を上書きできる様になりました。

emotionのインストール

emotionと必要なBabelプラグインをインストールしていきます。

また今回はcss propを使用するため@emotion/styledはインストールしません。

$ npm install --save @emotion/react

$ npm install --save-dev@babel/preset-react @babel/plugin-transform-react-jsx@emotion/babel-plugin

.babelrcの作成

Babelの構成を作成していきます。

プロジェクトルートに.babelrcファイルを作成して以下の様に書き換えます。{
"presets": [
    [
      "@babel/preset-react",
      { "runtime": "automatic", "importSource": "@emotion/react" }
    ]
  ],
  "plugins": ["@emotion/babel-plugin",
    [
      "@babel/plugin-transform-react-jsx",
{
"throwIfNamespace": false,
"runtime": "automatic",
"importSource": "@emotion/react"
}
  ]
  ]
}

以上でトランスパイルには成功するようになりました。

ただtsconfigにも同じように設定しないとVScode上でエラーを吐き続けるためそちらも書き換えていきます。

tsconfig.extends.jsonの作成

craで作成したプロジェクトはtsconfigを書き換えようとしてもコンパイル時に強制的に削除されます。

なので今回はプロジェクトルートにtsconfig.extends.jsonを作成し、tsconfigからそれをextendsする形で設定を有効にします。

tsconfig.extends.jsonを以下の様にします。

{
  "compilerOptions": {
    "jsxImportSource": "@emotion/react",
  }
}
次にtsconfigでextendsします。
{
  "extends": "./tsconfig.extends.json",
  ...
}
これで無事実行できるようになりました。

まとめ

今回はcraでjsx pragmaを使用せずemotionのcss propを使用する手順を紹介していきました。

公式ページの方にも説明がない(craを使用する場合はjsx pragmaを使えと書いてある)のですが、babel使えるようにしてるし何とかならないかなーと色々試してみたら意外と簡単にできました。

皆さんもcss propを使用する際は参考にしてみてください。

 

 

The following two tabs change content below.

大城 顕也

都内でフリーランスエンジニアをしてます 得意領域はフロントエンドでTypeScript、Reactを主に使用しています

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア