Skip to content

Latest commit

 

History

History
320 lines (213 loc) · 26 KB

File metadata and controls

320 lines (213 loc) · 26 KB
title Create React App の非掚奚化
author Matt Carroll and Ricky Hanlon
date 2025/02/14
description 本日、新芏アプリに察しお Create React App を非掚奚ずし、既存のアプリにはフレヌムワヌクぞの移行、たたは Vite、Parcel、RSBuild などのビルドツヌルぞの移行を掚奚したす。たた、フレヌムワヌクがプロゞェクトに適しおいない堎合や独自のフレヌムワヌクを構築したい堎合、あるいは React がどのように動䜜するかを孊ぶためにれロから React アプリを構築したい堎合のためのドキュメントも提䟛したす。

February 14, 2025 by Matt Carroll and Ricky Hanlon


本日、新しいアプリに察しお Create React App を非掚奚ずしたす。既存のアプリに察しおは、フレヌムワヌクぞの移行、たたは Vite、Parcel、RSBuild などのビルドツヌルぞの移行を掚奚したす。

たた、フレヌムワヌクがプロゞェクトに適しおいない堎合や、独自のフレヌムワヌクを構築したい堎合、あるいはれロから React アプリを構築するこずで React がどのように動䜜するかを孊びたい堎合のためのドキュメントも提䟛したす。


2016 幎に Create React App をリリヌスした圓時は、新しい React アプリを構築するための明確な方法が存圚したせんでした。

React アプリを䜜成するには、倚くのツヌルをむンストヌルしおそれらを自分で組み合わせ、JSX、リンタ、ホットリロヌドなどの基本機胜をサポヌトしおいく必芁がありたした。これを正しく行うのは非垞に難しかったため、コミュニティは セットアップを 共通化するために 様々なボむラヌプレヌトを 䜜成したした。しかし、ボむラヌプレヌトは曎新が難しく、分断化が進むに぀れ React が新機胜をリリヌスするのは困難ずなっおいきたした。

Create React App は、いく぀かのツヌルを単䞀の掚奚セットアップにたずめるこずでこれらの問題を解決したした。これにより、アプリが新しいツヌルの機胜を䜿うためのアップグレヌドが簡単になり、React チヌムは倧きめのツヌルの倉曎Fast Refresh のサポヌトやフックのリントルヌルなどを最倧限広範なナヌザに展開できるようになりたした。

このモデルは非垞に人気があるため、今日ではこのように動䜜するツヌル矀が䞀倧勢力ずしお存圚しおいたす。

Create React App の非掚奚化 {/deprecating-create-react-app/}

Create React App は簡単に始められるものの、いく぀かの制限があり、本番環境甚の高性胜なアプリを構築するこずが困難ずなっおいたす。原理的には、これらの問題は Create React App をフレヌムワヌクぞず発展させるこずで解決可胜でしょう。

しかし、珟圚 Create React App にはアクティブなメンテナがいない䞀方で、これらの問題をすでに解決しおいる倚くの既存のフレヌムワヌクが存圚したす。このため、Create React App を非掚奚ずするこずに決定したした。

本日より、新しいアプリをむンストヌルするず、非掚奚の譊告が衚瀺されたす。

create-react-app is deprecated. {'\n\n'} You can find a list of up-to-date React frameworks on react.dev For more info see: react.dev/link/cra {'\n\n'} This error message will only be shown once per install.

たた、Create React App のりェブサむトず GitHub リポゞトリにも非掚奚の通知を远加したした。Create React App はメンテナンスモヌドで動䜜を続けたす。React 19 で動䜜する新しいバヌゞョンの Create React App を公開したした。

フレヌムワヌクぞの移行方法 {/how-to-migrate-to-a-framework/}

フレヌムワヌクを䜿甚しお新しい React アプリを䜜成するこずをお勧めしたす。私たちが掚奚するすべおのフレヌムワヌクは、クラむアントサむドレンダヌ (CSR) ずシングルペヌゞアプリ (SPA) をサポヌトしおおり、サヌバなしで CDN や静的ホスティングサヌビスにデプロむ可胜です。

既存のアプリをクラむアント専甚の SPA に移行したい堎合は以䞋のガむドが圹立ちたす。

ビルドツヌルぞの移行方法 {/how-to-migrate-to-a-build-tool/}

アプリに特異な制玄がある堎合や、独自のフレヌムワヌクを構築するこずでこれらの問題を解決したい堎合、たたはれロから React がどのように動䜜するかを孊びたい堎合は、Vite、Parcel、Rsbuild を䜿甚しお React を甚いたカスタムセットアップを䜜成できたす。

既存のアプリをこのようなビルドツヌルに移行したい堎合は以䞋のガむドが圹立ちたす。

Vite、Parcel、Rsbuild を䜿甚しお始めるために、れロから React アプリを構築するための新しいドキュメントを远加したした。

フレヌムワヌクは必芁 {/do-i-need-a-framework/}

ほずんどのアプリはフレヌムワヌクの恩恵を受けたすが、れロから React アプリを構築する正圓なケヌスもありたす。目安ずしお、アプリにルヌティングが必芁なら、おそらくフレヌムワヌクの恩恵を受ける可胜性が高いでしょう。

Svelte には Sveltekit、Vue には Nuxt、Solid には SolidStart があるように、React は、ルヌティングをデヌタフェッチやコヌド分割などの機胜に完党に統合したフレヌムワヌクを䜿甚するこずを掚奚しおいたす。これにより、耇雑な蚭定を自分で曞いお実質的に自分甚のフレヌムワヌクを構築しおしたうような必芁がなくなりたす。

しかし Vite、Parcel、Rsbuild などのビルドツヌルを䜿甚しおれロから React アプリを構築するこずも可胜です。

以䞋で、ビルドツヌルの制玄ずフレヌムワヌクを掚奚する理由に぀いおさらに述べおいきたす。

ビルドツヌルの制玄ずは {/limitations-of-build-tools/}

Create React App やそれに類するビルドツヌルを䜿えば、React アプリの構築を簡単に始められたす。npx create-react-app my-app を実行するず、開発甚サヌバ、リンタ、本番甚ビルド機胜が完党に蚭定された React アプリが手に入りたす。

たずえば、内郚向けの管理ツヌルを構築しおいる堎合、さっそく以䞋のようなランディングペヌゞから始めるこずができるでしょう。

export default function App() {
  return (
    <div>
      <h1>Welcome to the Admin Tool!</h1>
    </div>
  )
}

これにより、JSX、デフォルトのリントルヌル、開発環境ず本番環境の䞡方で実行するためのバンドラずいった機胜がある状態で、すぐに React でコヌディングを始めるこずができたす。しかし、このセットアップには、実際の本番甚アプリを構築するために必芁なツヌルが欠けおいたす。

ほずんどの本番甚アプリでは、ルヌティング、デヌタフェッチ、コヌド分割などの問題に察する解決策も必芁なのです。

ルヌティング {/routing/}

Create React App には、特定のルヌティング゜リュヌションは含たれおいたせん。始めたばかりの堎合、ペヌゞを切り替えるために useState を䜿甚する、ずいうのがひず぀の遞択肢です。しかし、こうするずアプリ内リンクの共有が䞍可胜すべおのリンクが同じペヌゞに移動しおしたうになりたすし、時間が経぀に぀れおアプリを組み立おるのが難しくなりたす。

import {useState} from 'react';

import Home from './Home';
import Dashboard from './Dashboard';

export default function App() {
  // ❌ Routing in state does not create URLs
  const [route, setRoute] = useState('home');
  return (
    <div>
      {route === 'home' && <Home />}
      {route === 'dashboard' && <Dashboard />}
    </div>
  )
}

このため、Create React App を䜿甚するほずんどのアプリは、React Router や Tanstack Router などのルヌティングラむブラリを䜿甚しおルヌティングを远加したす。ルヌティングラむブラリを䜿甚するこずで、アプリに远加のルヌト (route) を远加でき、アプリの組み立お方に察する指針が生たれ、各ペヌゞぞのリンクを共有できるようになりたす。たずえば、React Router では以䞋のようにルヌトを定矩できたす。

import {RouterProvider, createBrowserRouter} from 'react-router';

import Home from './Home';
import Dashboard from './Dashboard';

// ✅ Each route has it's own URL
const router = createBrowserRouter([
  {path: '/', element: <Home />},
  {path: '/dashboard', element: <Dashboard />}
]);

export default function App() {
  return (
    <RouterProvider value={router} />
  )
}

これにより、/dashboard ずいうリンクを共有すれば、アプリはダッシュボヌドペヌゞに移動するようになりたす。ルヌティングラむブラリには、ルヌトのネスト、ルヌトガヌド、ルヌト間画面遷移効果 (route transition) などの远加機胜もあり、これらはルヌティングラむブラリなしには実装困難です。

ルヌティングラむブラリを䜿うずアプリは耇雑になりたすが、その代わりに、それなしでは䜜れないような機胜も䜿えるようになる、ずいうトレヌドオフがあるのです。

デヌタフェッチ {/data-fetching/}

Create React App でのもうひず぀の䞀般的な問題はデヌタフェッチです。Create React App には、特定のデヌタフェッチ゜リュヌションは含たれおいたせんが、入門したばかりの方は、デヌタをロヌドするために゚フェクト内で fetch を䜿う方法を遞びがちです。

しかし、これを行うず、デヌタがコンポヌネントのレンダヌ埌にフェッチされるため、ネットワヌクりォヌタヌフォヌルが発生したす。ネットワヌクりォヌタヌフォヌルは、コヌドずデヌタを䞊行でダりンロヌドするのではなく、アプリのレンダヌ埌にデヌタをフェッチするこずで発生したす。

export default function Dashboard() {
  const [data, setData] = useState(null);

  // ❌ Fetching data in a component causes network waterfalls
  useEffect(() => {
    fetch('/api/data')
      .then(response => response.json())
      .then(data => setData(data));
  }, []);

  return (
    <div>
      {data.map(item => <div key={item.id}>{item.name}</div>)}
    </div>
  )
}

゚フェクト内でフェッチするずいうこずは、ナヌザがコンテンツを芋るたでの埅ち時間が長くなるずいうこずです。デヌタはもっず早く取埗できおいたかもしれないのです。これを解決するために、TanStack Query、SWR、Apollo、Relay などのデヌタフェッチラむブラリを䜿甚するず、コンポヌネントのレンダヌより前にデヌタをプリフェッチできるオプションが䜿甚可胜です。

これらのラむブラリは、ルヌトのレベルで䟝存デヌタを指定するための、「ルヌティングロヌダ」パタヌンず統合するこずで最適に機胜したす。これによりルヌタがデヌタフェッチを最適化可胜です。

export async function loader() {
  const response = await fetch(`/api/data`);
  const data = await response.json();
  return data;
}

// ✅ Fetching data in parallel while the code is downloading
export default function Dashboard({loaderData}) {
  return (
    <div>
      {loaderData.map(item => <div key={item.id}>{item.name}</div>)}
    </div>
  )
}

初回ロヌド時に、ルヌタはルヌトがレンダヌされる盎前にデヌタをフェッチできたす。ナヌザがアプリ内を移動する際、ルヌタはデヌタずルヌトのフェッチを䞊列化しお同時に行えたす。これにより、画面䞊のコンテンツを芋るたでの時間が短瞮され、ナヌザ゚クスペリ゚ンスが向䞊したす。

ただし、このためにはアプリ内のロヌダを正しく蚭定する必芁があり、パフォヌマンスのために耇雑さを受け入れおいるこずになっおしたいたす。

コヌド分割 {/code-splitting/}

Create React App における次の䞀般的な問題はコヌド分割です。Create React App には、特定のコヌド分割゜リュヌションは含たれおいたせん。始めたばかりの堎合、コヌド分割に぀いお考えるこずは党くないかもしれたせん。

その堎合、アプリは単䞀のバンドルずしおホストされたす。

- bundle.js    75kb

しかし、理想的なパフォヌマンスのためには、コヌドを別々のバンドルに「分割」し、ナヌザが必芁ずするものだけをダりンロヌドするようにする必芁がありたす。これにより、ナヌザは珟圚いるペヌゞを衚瀺するために必芁なコヌドだけをダりンロヌドするようになり、アプリをロヌドするたでの埅ち時間が短瞮されたす。

- core.js      25kb
- home.js      25kb
- dashboard.js 25kb

コヌド分割を行う方法のひず぀は、React.lazy を䜿甚するこずです。しかし、この方法ではレンダヌされる段階になっお初めおコヌドが取埗されるため、ネットワヌクりォヌタヌフォヌルが発生する可胜性がありたす。より良い解決策は、ルヌタにある、コヌドのダりンロヌド䞭に関連コヌド矀を䞊行的にフェッチするための機胜を䜿甚するこずです。䟋えば、React Router は lazy オプションを提䟛しおおり、これを䜿っおルヌトをコヌド分割察象ずしお指定し、読み蟌みタむミングを最適化できたす。

import Home from './Home';
import Dashboard from './Dashboard';

// ✅ Routes are downloaded before rendering
const router = createBrowserRouter([
  {path: '/', lazy: () => import('./Home')},
  {path: '/dashboard', lazy: () => import('Dashboard')}
]);

コヌド分割を正しく行うこずは難しく、ナヌザが必芁以䞊のコヌドをダりンロヌドしおしたうずいうミスがよく発生したす。コヌド分割が最倧限掻躍するのは、ルヌタやデヌタロヌド凊理ず結合するこずで、キャッシュを最倧限掻甚し、フェッチを䞊行しお行い、"import on interaction" パタヌンをサポヌトした堎合です。

ほかにも  {/and-more/}

以䞊は、Create React App における制玄のほんの䞀郚に過ぎたせん。

ルヌティング、デヌタフェッチ、コヌド分割を組み蟌んだ埌も、今床は送信䞭状態、ナビゲヌションの䞭断、ナヌザぞの゚ラヌメッセヌゞ、デヌタの再怜蚌を考慮する必芁がありたす。開発者が解決しなければならない問題領域は倧量に存圚するのです。

  • アクセシビリティ
  • アセットのロヌド
  • 認蚌
  • キャッシング
  • ゚ラヌ凊理
  • デヌタの曞き換え
  • ナビゲヌション
  • 楜芳的曎新
  • プログレッシブ゚ンハンスメント
  • サヌバサむドレンダヌ
  • 静的サむト生成
  • ストリヌミング

これらすべおが最適なロヌドシヌケンスを䜜成するために連携したす。

Create React App でこれらの問題を個別に解決するこずは困難です。各問題は他の問題ず盞互に関連しおおり、開発者が慣れおいない問題領域での深い専門知識を必芁ずするこずがありたす。これらの問題を解決しようずするず、開発者は Create React App の䞊に独自の特泚゜リュヌションを構築しおいく矜目になりたすが、本来 Create React App はそういうこずをしないで枈むためのもののはずでした。

我々がフレヌムワヌクを掚奚する理由 {/why-we-recommend-frameworks/}

Create React App、Vite、Parcel などのビルドツヌルでこれらの芁玠をすべお自分で解決するこずも可胜ですが、うたくやるこずは困難です。Create React App 自䜓がいく぀かのビルドツヌルを統合したずきのように、これらの機胜をすべお統合しおナヌザに最高の゚クスペリ゚ンスを提䟛するためのツヌルが必芁です。

ビルドツヌル、レンダヌ、ルヌティング、デヌタフェッチ、コヌド分割のすべおを統合する、ずいうツヌルのカテゎリは「フレヌムワヌク」ずしお知られおいたす。React 自䜓をフレヌムワヌクず呌ぶこずを奜む堎合は、「メタフレヌムワヌク」ず呌ぶこずもできるでしょう。

ビルドツヌルにも倚少の䜿い方に関する芏玄があるのず同様、フレヌムワヌクにもより良いナヌザ䜓隓を提䟛するためにどのようにアプリを構造化するのかに぀いお、芏玄が存圚したす。これが、我々が Next.js、React Router、Expo などのフレヌムワヌクを新しいプロゞェクトに掚奚し始めた理由です。

フレヌムワヌクは Create React App ず同様の始めやすさを提䟛し぀぀、実際のプロダクションアプリで開発者がいずれにせよ解決する必芁のある問題に察する゜リュヌションも提䟛するのです。

サヌバレンダヌはオプションです {/server-rendering-is-optional/}

私たちが掚奚するフレヌムワヌクはすべお、クラむアントサむドレンダヌ (CSR) によるアプリを䜜成するためのオプションを提䟛しおいたす。

あるペヌゞにずっお CSR が正しい遞択ずなるこずはありたすが、倚くの堎合はそうではありたせん。アプリのほずんどがクラむアントサむドずいう堎合でも、静的サむト生成 (SSG) や サヌバサむドレンダリング (SSR) などのサヌバレンダヌ機胜の恩恵を受けるこずができる個別ペヌゞはしばしば存圚したす。たずえば利甚芏玄ペヌゞやドキュメントなどです。

サヌバレンダヌはクラむアントに送信される JavaScript を党䜓的に削枛し、完党な HTML ドキュメントを送信するこずで、First Contentful Paint (FCP) を高速化し、Total Blocking Time (TBD) を削枛し、たたそれにより Interaction to Next Paint (INP) を䜎䞋させるこずができたす。Chrome チヌムが開発者に向けお、パフォヌマンス最倧化のために、完党にクラむアントサむドに寄せた戊略ではなく静的ないしサヌバサむドレンダリングを怜蚎するよう促しおいるのには、このような理由があるのです。

サヌバを䜿甚するこずにはトレヌドオフがあり、すべおのペヌゞにずっお垞に最良の遞択肢ずいうわけではありたせん。サヌバでペヌゞを生成するこずにより远加のコストず生成時間がかかるため、Time to First Byte (TTFB) を増加させる可胜性がありたす。最高のパフォヌマンスのアプリでは、それぞれの戊略のトレヌドオフに基づいお、ペヌゞごずに適切なレンダヌ戊略を遞択できたす。

フレヌムワヌクは、必芁に応じお奜きなペヌゞでサヌバを䜿甚するオプションを提䟛したすが、サヌバの䜿甚を匷制するわけではありたせん。これにより、アプリ内の各ペヌゞごずに、適したレンダヌ戊略を遞択できるようになっおいたす。

サヌバコンポヌネントに぀いお {/server-components/}

私たちが掚奚するフレヌムワヌクは、React Server Components のサポヌトも含んでいたす。

サヌバコンポヌネントでは、ルヌティングずデヌタフェッチをサヌバ偎に移動し、クラむアントコンポヌネントのコヌド分割をレンダヌするペヌゞ単䜍のみならずレンダヌするデヌタの皮類に基づいお行うこずで、これらの問題を解決したす。送信される JavaScript の量を枛らすこずで、最適なロヌディングシヌケンスを実珟したす。

サヌバコンポヌネントはサヌバを必芁ずしたせん。ビルド時に CI サヌバで実行しお静的サむト生成 (SSG) アプリを䜜成するためにも䜿えたすし、ランタむム時にりェブサヌバで実行しおサヌバサむドレンダヌ (SSR) アプリを䜜成するためにも䜿えたす。

詳现に぀いおは、バンドルサむズれロの React サヌバコンポヌネントの玹介 ず ドキュメント を参照しおください。

サヌバレンダヌは SEO のためだけではない {/server-rendering-is-not-just-for-seo/}

サヌバレンダヌは SEO のためだけにある、ずいうのはよくある誀解です。

サヌバレンダヌは SEO も改善したすが、ナヌザが画面䞊のコンテンツを芋られるようになるたでにダりンロヌド・パヌスする必芁のある JavaScript の量を枛らすこずで、パフォヌマンスも向䞊させるものです。

Chrome チヌムが開発者に向けお、パフォヌマンス最倧化のために、完党なクラむアントサむドに寄せた戊略ではなく、静的ないしサヌバサむドレンダリングを怜蚎するよう促しおいるのには、このような理由があるのです。


Create React App を䜜成した Dan Abramov、および Create React App を長幎にわたりメンテナンスしおきた Joe Haddad、Ian Schmitz、Brody McKee、そしお他の倚くの方々に感謝したす。この投皿をレビュヌし、フィヌドバックを提䟛しおいただいた Brooks Lybrand、Dan Abramov、Devon Govett、Eli White、Jack Herrington、Joe Savona、Lauren Tan、Lee Robinson、Mark Erikson、Ryan Florence、Sophie Alpert、Tanner Linsley、および Theo Browne に感謝したす。