🔥

CreateReactAppでReact 18のプロジェクトを作るとエラーがでる

2022/04/12に公開

概要

CreateReactAppでReactのプロジェクトを作ってReactの勉強をしています。
CreateReactAppで自動生成されるコードの一部がどうやらReact 18に対応していないようです。

事象

$ npx create-react-app <project-name>
$ cd <project-name>
$ yarn start

browserからlocalhost:3000にアクセスすると以下のエラーがconsoleに出力される。

Warning: ReactDOM.render is no longer supported in React 18. Use createRoot instead. Until you switch to the new API, your app will behave as if it's running React 17. Learn more: https://reactjs.org/link/switch-to-createroot

生成されたコードの一部

src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

対処法

こちらのブログで触れられています。
https://reactjs.org/blog/2022/03/08/react-18-upgrade-guide.html#updates-to-client-rendering-apis

src/index.js
import React from 'react';
- import ReactDOM from 'react-dom';
+ import { createRoot } from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';

- ReactDOM.render(
-   <React.StrictMode>
-     <App />
-   </React.StrictMode>,
-   document.getElementById('root')
- );

+ const container = document.getElementById('root');
+ const root = createRoot(container);
+ root.render(<App />);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

最後に

Reactはまだまだこれからですが、公式のドキュメントやブログが非常に丁寧なのでしっかり確認しようと思います。
一方でけっこう果敢に変更がマージされるっぽい雰囲気を感じ取ったので、どんどんキャッチアップしていこうと思いました。

Discussion