React・公開する

ビルドして公開する

npm run buildで何が作られるのか、distの中身を1つずつ確かめてから公開します。Reactを積むとどれくらい重くなるのか、サブフォルダに置くとなぜ真っ白になるのかも正直に扱い、次に学ぶことの地図で締めます。

最終回です。作ったものを公開できる形にします。

npm run buildで何が起きるか

開発サーバーを止めずに、別のターミナル(またはCtrl + Cで止めてから)で打ちます。

npm run build
vite v8.2.0 building client environment for production...
 18 modules transformed.
dist/index.html                   0.48 kB gzip:  0.34 kB
dist/assets/index-CLcBXoKv.css   10.85 kB gzip:  2.93 kB
dist/assets/index-J346tj5A.js   193.28 kB gzip: 61.14 kB

 built in 381ms

dist/フォルダに、公開用の一式ができました。

dist/
├── assets/
│   ├── index-CLcBXoKv.css
│   └── index-J346tj5A.js
├── birds.json
├── favicon.svg
└── index.html

やっていることは3つです。

  1. JSXをふつうのJavaScriptに変換する——ブラウザはJSXを読めないので
  2. ファイルをまとめる——App.tsxBirdCard.tsx・React本体などを1つのJSに
  3. CSSを書き出す——Tailwindが、実際に書いたクラスだけを集めて出力する

public/に置いたbirds.jsonが、そのままdist/にコピーされているのも確認できます。

公開する前に手元で確認する

dist/index.htmlをダブルクリックで開いても正しく動きません(ファイルの読みこみ方が変わるため)。確認用のコマンドが用意されています。

npm run preview

http://localhost:4173のようなURLが出ます。これが本番と同じ形です。開発サーバーと違って自動更新はしないので、コードを直したらnpm run buildからやり直します。

正直な話:Reactを積むと重くなる

さきほどのビルド結果を、もう一度見てください。

ファイルサイズ圧縮後
JavaScript193.28 kB61.14 kB
CSS10.85 kB2.93 kB

このアプリのコードは200行ほどです。残りはReactの本体。つまり、何を作っても最低60KBほどのJavaScriptが乗るということです。

どこに置くか

dist/の中身はただの静的ファイルなので、置き場所は選び放題です。

  • Cloudflare Pages——このサイトも使っています。無料枠が広い
  • Netlify——distフォルダをドラッグ&ドロップするだけでも公開できる
  • GitHub Pages——Gitコースで扱った方法がそのまま使えます

どれもGitHubのリポジトリとつなぐと、pushするたびに自動でビルドして公開してくれます。手元でnpm run buildを打つ必要すらなくなります。

べんりワザ作ったサイトをネットに公開する方法公開の手順そのものはこちらにまとめてあります。Reactのアプリでも流れは同じです1Reactページを分ける(React Router)ルーティングを入れたアプリは、この設定(SPAフォールバック)を足さないと詳細ページのURLで404になりますGit・GitHubGitHub Pagesで公開するGitHubに置いて公開する手順はGitコースのこちらへ

設定値は.envに置く

公開先によって変わる値(APIのURLなど)をコードに直接書くと、環境ごとに書きかえることになります。Viteでは.envファイルが使えます。

VITE_API_URL=https://api.example.com
const url = import.meta.env.VITE_API_URL

名前の先頭をVITE_にしたものだけが読みこまれます。これは「うっかり全部の環境変数がブラウザに出てしまう」のを防ぐための決まりです。

JavaScriptfetch:外のデータを取り寄せるAPIキーをフロント側に置いてはいけない理由は、JavaScriptコースのこの回にも書いてあります

次に学ぶこと

このコースでは、Reactの本体・Router・TypeScript・データ取得・テストまで扱いました。ここから先は、必要になったときに足す道具です。

次の一歩どんなときに要るか
React Hook Form + zod入力欄が10を超えるフォーム。検証ルールを型と一緒に持てる
状態管理ライブラリ(Zustandなど)Contextでは配りきれないほど状態が増えたとき。多くのアプリでは不要
E2Eテスト(Playwrightなど)画面をまたいだ流れ(ログイン→購入)をまるごと確かめたい
デザインシステム/UIライブラリチームで見た目をそろえる。自作か既製品かの判断ごと

WordPressをやってきた人なら、この知識はそのまま2方向につながります

  • ブロックの自作——WordPressのブロックエディタはReactで作られています。propsuseStateもそのまま出てきます
  • ヘッドレス構成——WordPressをデータの置き場(REST API)にして、表側をReactで作る
WordPressWordPressってなに?WordPress側の話はこちら。管理画面のブロックエディタがReactでできている、という視点で読み直すと発見があります

公式ドキュメントも見てみる

ja.react.dev外部サイトReact アプリの作成 – React公式の「Reactアプリの作成」。フレームワークを使う選択肢がまとまっています。次の一歩を選ぶときに読んでください

このレッスンのまとめ

  1. npm run builddist/に公開用の一式ができる(JSXの変換・結合・CSSの書き出し)
  2. ファイル名の英数字は中身から計算した目印——キャッシュ事故を防ぐしくみ
  3. 手元での最終確認はnpm run previewindex.htmlの直開きでは動かない)
  4. Reactを積むと圧縮後で約60KB増える。変わらないページには向かない
  5. dist/ただの静的ファイル——Cloudflare Pages・Netlify・GitHub Pagesに置ける
  6. サブフォルダ公開で真っ白になったらbaseを指定する
  7. 次はフォームライブラリ・状態管理・E2Eテスト——必要になってから足せばいい

全32回、おつかれさまでした。Reactは「画面を作り直す係」——最初の回で言ったこれが、いまは実感として分かるはずです。

やってみよう:ビルドして公開の形にする

最後に、作ったアプリを公開できる形にします。

  1. npm run buildを実行し、dist/フォルダができるのを確認する
  2. 表示されたファイルサイズを見る(JavaScriptの圧縮後が60KB前後のはずです)
  3. npm run previewを実行し、表示されたURLで本番と同じ形の画面を確認する
  4. 星をいくつか付けてリロードし、保存が効いていることを確かめる
npm run build
npm run preview
8羽のカードが並び、3羽に★が付いた完成画面。検索ボックスと「お気に入りだけ見る」のチェックボックスがある
npm run previewで見る、公開されるのと同じ画面

ここまで動いたら、dist/の中身をそのままホスティングに置けば公開できます。自分のURLで動くところまで行けたら、このコースは完了です。

よくある質問

npm run buildは何をしていますか?
JSXを変換し、複数のファイルをまとめ、使っているTailwindのクラスだけを集めてCSSを書き出し、distフォルダに公開用の一式を作ります。開発サーバーは動かしたままでも実行できます。
distの中身をそのままサーバーに置けばいいですか?
はい。中身は静的なHTML・CSS・JavaScriptなので、Cloudflare PagesやNetlifyのような静的ホスティングにそのまま置けます。PHPなどのサーバー側の仕組みは要りません。
公開したら画面が真っ白になりました
サブフォルダに置いたときの定番のつまずきです。ファイルの読みこみ先がルートからの絶対パスになっているためで、vite.config.tsにbaseを指定すると直ります。ブラウザのコンソールに404が並んでいれば、この原因です。
Reactを使うとページは重くなりますか?
重くなります。この小さなアプリでも、圧縮後で約60KBのJavaScriptが増えます。データがほとんど変わらないページなら、素のHTMLのほうが速いという判断もあります。