Closed7

tsconfig.jsonのcompilerOptions.jsxをreactからreact-jsxに変えるために必要なことを理解する

Hirotaka MiyagiHirotaka Miyagi

background

TypeScript/Reactプロジェクトに@emotion/reactの導入を進めており、その際の理想の設定としてcompilerOptions.jsxをreactからreact-jsxに変えるというのがある。

https://emotion.sh/docs/typescript#emotionreact

この変更が何を指しているのか、変更に伴うリスクはあるかを理解したい

Hirotaka MiyagiHirotaka Miyagi

https://zenn.dev/uhyo/articles/react17-new-jsx-transform

  • _jsx はreact/jsx-runtimeからimportされ、このimport文は コンパイラが自動挿入する
  • "react-jsx" と "react-jsxdev" があり、development環境でのデバッグが容易になる
  • 少しだけバンドルサイズの削減が期待できる

https://reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html

  • 公式ドキュメント
  • eslint-plugin-reactを使用している場合、react/jsx-uses-reactおよびreact/react-in-jsx-scopeルールは不要になるためoffにした方が良い
  • npx react-codemod update-react-imports で不要なReactのimportを削除できる
Hirotaka MiyagiHirotaka Miyagi

環境によって "react-jsx" と "react-jsxdev" を切り替える

webpackのts-loaderを利用している場合、一番手っ取り早いのはwebpack.config.js内で分岐するのが簡単そうだ。

  {
    test: /\.tsx?$/,
    exclude: 'node_modules',
    use: {
      loader: 'ts-loader',
      options: {
        compilerOptions: {
          jsx:
            process.env.NODE_ENV === 'development'
              ? 'react-jsxdev'
              : 'react-jsx',
        },
      },
    },
  },

ref: https://github.com/facebook/create-react-app/issues/10025#issuecomment-892754278

Hirotaka MiyagiHirotaka Miyagi

ネット上では切り替えたことによって挙動が変わったみたいな事例は見つけられなかった
取り急ぎ grep -l "_jsxDEV(" dist/* で React.createElementから_jsxDEVに切り替わっていることを確認

このスクラップは2022/08/08にクローズされました