Reactアプリのデプロイ方法|無料で公開する3つの選択肢
Reactアプリを無料でデプロイする方法を解説。Netlify、Vercel、GitHub Pagesの3つの選択肢について、手順、特徴、メリット・デメリットを詳しく説明します。
みなさん、Reactアプリを作った後どうしていますか?
「せっかく作ったアプリをみんなに見せたい」 「でもデプロイって難しそう...」 「お金をかけずに公開したい」
そんな風に思ったことはありませんか?
この記事では、Reactアプリを無料でデプロイする方法をご紹介します。 Netlify、Vercel、GitHub Pagesという3つの選択肢について、手順やメリット・デメリットを詳しく解説していきます。
初心者の方でも安心して取り組めるように、一つずつ丁寧に説明していきますね。
Reactアプリをデプロイする前に知っておきたいこと
まずは、デプロイの基本的な考え方を理解しましょう。
デプロイって何?
デプロイとは、作ったアプリをインターネット上で公開することです。 今まで自分のパソコンでしか見られなかったアプリを、世界中の人がアクセスできるようにします。
簡単に言うと、お店をオープンするような感じですね。
開発中と公開後の違い
開発中は、こんな感じでアプリを起動していましたよね。
npm start
このコマンドを実行すると、ブラウザで http://localhost:3000
が開きます。
でも、これはあなたのパソコンの中だけで動いているんです。
公開するには、まずビルドという作業が必要です。
npm run build
このコマンドを実行すると、build
フォルダが作られます。
この中に、公開用に最適化されたファイルが入っています。
buildフォルダの中身を見てみよう
ビルドが完了すると、こんな構成になります。
build/
├── index.html
├── static/
│ ├── css/
│ │ └── main.abc123.css
│ ├── js/
│ │ └── main.xyz789.js
│ └── media/
│ └── logo.png
└── manifest.json
index.html
がメインファイルで、static
フォルダにCSS、JavaScript、画像が入っています。
ファイル名にabc123
のような文字が付いているのは、キャッシュ対策のためです。
ちょっと複雑に見えるかもしれませんが、これが公開用のファイルになります。
SPAの特殊な事情
ReactアプリはSPA(Single Page Application)なので、少し特殊な設定が必要です。
通常のウェブサイトでは、/about
にアクセスするとabout.html
ファイルを表示します。
でもReactアプリでは、すべてのページがindex.html
から作られています。
// React Routerの例
import { BrowserRouter, Routes, Route } from 'react-router-dom';
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</BrowserRouter>
);
}
この設定だと、/about
にアクセスしてもindex.html
を表示する必要があります。
「なんだか面倒そう...」と思うかもしれませんが、大丈夫です! 今から紹介する3つのサービスが、この問題を簡単に解決してくれます。
選択肢1: Netlifyで簡単デプロイ
Netlifyは、GitHubと連携してデプロイできるサービスです。
Netlifyの特徴
Netlifyには、こんな特徴があります。
- 無料プランが充実している
- GitHubとの連携が簡単
- 自動ビルド機能がある
- フォーム機能も使える
- カスタムドメインにも対応
初心者にとって一番取り組みやすいサービスだと思います。
手順1: GitHubリポジトリを準備しよう
まず、あなたのReactアプリをGitHubにアップロードします。
git init
git add .
git commit -m "Initial commit"
これでローカルでのGit管理が始まりました。
次に、GitHubでリポジトリを作成します。 GitHubのサイトで「New repository」をクリックして、リポジトリ名を入力してください。
作成したら、こんな感じでリモートリポジトリを追加します。
git remote add origin https://github.com/あなたのユーザー名/リポジトリ名.git
git push -u origin main
あなたのユーザー名
とリポジトリ名
は、実際のものに置き換えてくださいね。
手順2: Netlifyアカウントを作成しよう
Netlifyの公式サイト(https://netlify.com)にアクセスします。 「Sign up」をクリックして、アカウントを作成してください。
GitHubアカウントで連携することをおすすめします。 こうすることで、後の設定がとても簡単になります。
手順3: サイトを作成しよう
Netlifyにログインしたら、ダッシュボードが表示されます。 「New site from Git」という青いボタンをクリックしてください。
次に、こんな手順で進みます。
- GitHubを選択する
- リポジトリを選択する
- ブランチを確認する(通常は
main
) - ビルド設定を確認する
ビルド設定では、以下のように入力します。
Build command: npm run build
Publish directory: build
これで、Netlifyが自動的にビルドしてくれます。
手順4: デプロイを実行しよう
設定が完了したら、「Deploy site」をクリックします。
初回のデプロイには3-5分程度かかります。 コーヒーでも飲みながら待ちましょう。
デプロイが完了すると、こんな感じのURLが表示されます。
https://awesome-app-123456.netlify.app
このURLをクリックすると、あなたのReactアプリが表示されます!
手順5: React Routerの設定
React Routerを使っている場合は、追加設定が必要です。
プロジェクトのpublic
フォルダに_redirects
ファイルを作成してください。
/* /index.html 200
この1行を書くだけで、すべてのページが正しく表示されます。
たった1行ですが、これがないと/about
などのページで404エラーが出てしまいます。
自動デプロイの仕組み
Netlifyの素晴らしいところは、自動デプロイ機能です。
GitHubにコードをプッシュすると、自動的にビルドとデプロイが実行されます。
git add .
git commit -m "新機能を追加"
git push origin main
このプッシュをするだけで、数分後にはサイトが更新されます。
便利だと思いませんか?
Netlifyの便利な機能
Netlifyには、他にも便利な機能があります。
フォーム機能を使えば、お問い合わせフォームも簡単に作れます。
function ContactForm() {
return (
<form name="contact" method="POST" data-netlify="true">
<input type="hidden" name="form-name" value="contact" />
<div>
<label>お名前:</label>
<input type="text" name="name" required />
</div>
<div>
<label>メールアドレス:</label>
<input type="email" name="email" required />
</div>
<div>
<label>メッセージ:</label>
<textarea name="message" required></textarea>
</div>
<button type="submit">送信</button>
</form>
);
}
data-netlify="true"
を追加するだけで、フォームが動作します。
送信されたデータは、Netlifyの管理画面で確認できます。
Netlifyのメリット・デメリット
メリット
- GitHubとの連携が簡単
- 自動ビルド・デプロイ
- フォーム機能が無料で使える
- 設定が分かりやすい
デメリット
- 無料プランではビルド時間に制限がある
- 大量のアクセスがあると有料プランが必要
選択肢2: Vercelで高速デプロイ
Vercelは、高速なCDNと優秀なパフォーマンスで人気のサービスです。
Vercelの特徴
Vercelには、こんな特徴があります。
- 非常に高速なCDN
- 自動HTTPS化
- プレビューデプロイ機能
- Next.jsとの親和性が高い
- 解析機能も充実
パフォーマンスにこだわりたい方におすすめです。
手順1: Vercel CLIをインストール
まず、Vercel CLIをインストールします。
npm install -g vercel
これで、vercel
コマンドが使えるようになります。
もし、グローバルインストールが嫌な場合は、npx
でも使えます。
npx vercel
どちらでも同じ結果になるので、お好みで選んでください。
手順2: Vercelにログイン
次に、Vercelアカウントを作成してログインします。
vercel login
このコマンドを実行すると、ブラウザでVercelのサイトが開きます。
GitHubアカウントでログインすることをおすすめします。 連携がスムーズになります。
手順3: プロジェクトをデプロイ
Reactアプリのフォルダで、以下のコマンドを実行します。
vercel
初回実行時は、いくつか質問されます。
? Set up and deploy "my-react-app"? [Y/n] y
? Which scope do you want to deploy to? あなたのアカウント
? Link to existing project? [y/N] n
? What's your project's name? my-react-app
? In which directory is your code located? ./
基本的には、Enterを押すだけで進めます。
Vercelが自動的に設定を検出してくれるので、とても簡単です。
手順4: 自動設定を確認
Vercelは、あなたのプロジェクトを見て自動的に設定してくれます。
Framework Preset: Create React App
Build Command: npm run build
Output Directory: build
Install Command: npm install
この設定が表示されたら、正しく認識されています。
間違いがなければ、そのまま進みましょう。
手順5: デプロイ完了
設定が完了すると、自動的にデプロイが始まります。
数分後、こんな感じのURLが表示されます。
https://my-react-app-username.vercel.app
このURLをクリックすると、あなたのReactアプリが表示されます。
とても簡単だったでしょう?
GitHubとの連携
CLI以外にも、GitHubと連携する方法があります。
Vercelのダッシュボードで「New Project」をクリックします。 「Import Git Repository」から、GitHubリポジトリを選択してください。
これで、GitHubにプッシュするたびに自動デプロイされます。
プレビューデプロイ機能
Vercelのプレビューデプロイ機能は、とても便利です。
新しいブランチを作成してプッシュすると、自動的にプレビューURLが作成されます。
git checkout -b feature/new-component
git add .
git commit -m "新しいコンポーネントを追加"
git push origin feature/new-component
このプッシュをすると、こんな感じのプレビューURLが作成されます。
https://my-react-app-git-feature-username.vercel.app
本番環境に影響を与えずに、新機能をテストできます。
環境変数の設定
環境変数が必要な場合は、ダッシュボードで設定できます。
Project Settings → Environment Variables から追加してください。
または、CLIからも設定できます。
vercel env add REACT_APP_API_URL
値を入力すると、デプロイ時に自動的に反映されます。
カスタムドメインの設定
独自ドメインを使いたい場合は、ダッシュボードで設定できます。
Project Settings → Domains から、ドメインを追加してください。
例:
- myapp.vercel.app (無料)
- myapp.com (独自ドメイン)
独自ドメインを使う場合は、DNS設定も必要です。
Vercelのメリット・デメリット
メリット
- 非常に高速なCDN
- 自動最適化機能
- プレビューデプロイが便利
- 設定が簡単
デメリット
- 無料プランでは帯域制限がある
- 関数実行時間に制限がある
選択肢3: GitHub Pagesで完全無料デプロイ
GitHub Pagesは、完全無料で使えるサービスです。
GitHub Pagesの特徴
GitHub Pagesには、こんな特徴があります。
- 完全無料
- GitHubアカウントがあれば利用可能
- 自動デプロイに対応
- カスタムドメインも設定可能
- HTTPS対応
コストを抑えたい方には、最適な選択肢です。
手順1: gh-pagesパッケージをインストール
まず、gh-pages
パッケージをインストールします。
npm install --save-dev gh-pages
このパッケージが、GitHub Pagesへのデプロイを自動化してくれます。
手順2: package.jsonを設定
package.json
に設定を追加します。
{
"name": "my-react-app",
"version": "0.1.0",
"homepage": "https://あなたのユーザー名.github.io/リポジトリ名",
"private": true,
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"predeploy": "npm run build",
"deploy": "gh-pages -d build"
},
"devDependencies": {
"gh-pages": "^4.0.0"
}
}
homepage
の部分は、あなたの情報に置き換えてください。
predeploy
とdeploy
のスクリプトが、デプロイを自動化してくれます。
手順3: デプロイを実行
設定が完了したら、デプロイを実行します。
npm run deploy
このコマンドを実行すると、以下の処理が自動的に実行されます。
npm run build
でビルドgh-pages -d build
でデプロイ
初回のデプロイには、3-5分程度かかります。
手順4: GitHub Pagesの設定を確認
GitHubのリポジトリページで、設定を確認しましょう。
- Settingsタブをクリック
- 左サイドバーのPagesをクリック
- Sourceで「Deploy from a branch」を選択
- Branchで「gh-pages」を選択
- Saveをクリック
この設定で、GitHub Pagesが有効になります。
手順5: URLを確認
設定が完了すると、こんな感じのURLが表示されます。
https://あなたのユーザー名.github.io/リポジトリ名
このURLをクリックすると、あなたのReactアプリが表示されます。
GitHub Actionsで自動デプロイ
より高度な方法として、GitHub Actionsを使った自動デプロイもあります。
.github/workflows/deploy.yml
ファイルを作成してください。
name: Deploy to GitHub Pages
on:
push:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./build
このファイルを作成すると、mainブランチにプッシュするたびに自動デプロイされます。
GitHub Actionsについて詳しく知らなくても、コピペで使えます。
React Routerの対応
React Routerを使っている場合は、特別な設定が必要です。
方法1: HashRouterを使う
import { HashRouter, Routes, Route } from 'react-router-dom';
function App() {
return (
<HashRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</HashRouter>
);
}
BrowserRouter
の代わりにHashRouter
を使います。
URLに#
が入りますが、GitHub Pagesでは確実に動作します。
方法2: 404.htmlを作成
public/404.html
ファイルを作成して、リダイレクト処理を追加します。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>My React App</title>
<script type="text/javascript">
var pathSegmentsToKeep = 1;
var l = window.location;
l.replace(
l.protocol + '//' + l.hostname + (l.port ? ':' + l.port : '') +
l.pathname.split('/').slice(0, 1 + pathSegmentsToKeep).join('/') +
'/?/' +
l.pathname.slice(1).split('/').slice(pathSegmentsToKeep).join('/').replace(/&/g, '~and~') +
(l.search ? '&' + l.search.slice(1).replace(/&/g, '~and~') : '') +
l.hash
);
</script>
</head>
<body>
</body>
</html>
このファイルがあると、404エラーを避けることができます。
ちょっと複雑に見えますが、コピペで使えます。
カスタムドメインの設定
独自ドメインを使いたい場合は、public/CNAME
ファイルを作成します。
echo "myapp.com" > public/CNAME
または、GitHubのリポジトリ設定で追加することもできます。
Settings → Pages → Custom domain から設定してください。
GitHub Pagesのメリット・デメリット
メリット
- 完全無料
- GitHubとの完全統合
- 設定が比較的簡単
- GitHub Actionsとの連携
デメリット
- 静的サイトのみ(サーバーサイド機能なし)
- 容量制限(1GB)
- 転送量制限(月100GB)
3つのサービスを比較してみよう
どのサービスを選ぶか迷っている方のために、比較してみました。
機能比較表
項目 | Netlify | Vercel | GitHub Pages |
---|---|---|---|
無料プラン | ○ | ○ | ○ |
自動デプロイ | ○ | ○ | ○ |
カスタムドメイン | ○ | ○ | ○ |
HTTPS | ○ | ○ | ○ |
CDN | ○ | ○ | △ |
ビルド時間制限 | 300分/月 | 6000分/月 | 制限なし |
帯域制限 | 100GB/月 | 100GB/月 | 100GB/月 |
関数機能 | ○ | ○ | × |
フォーム機能 | ○ | × | × |
用途別のおすすめ
ポートフォリオサイト
- GitHub Pages がおすすめ
- 完全無料で使える
- 設定が簡単
ビジネスサイト
- Netlify がおすすめ
- フォーム機能が使える
- 初心者にも優しい
高性能Webアプリ
- Vercel がおすすめ
- 非常に高速
- 解析機能が充実
デプロイ時間の比較
初回デプロイ時間(目安):
- GitHub Pages: 3-5分
- Netlify: 2-4分
- Vercel: 1-3分
更新デプロイ時間(目安):
- GitHub Pages: 2-3分
- Netlify: 1-2分
- Vercel: 30秒-1分
Vercelが最も高速ですが、どのサービスも十分実用的です。
学習コストの比較
学習コストの低い順:
- GitHub Pages(GitHubの基本操作ができれば可能)
- Netlify(Git連携の理解が必要)
- Vercel(CLI操作の理解が必要)
初心者の方は、GitHub Pagesから始めることをおすすめします。
デプロイ前にやっておきたい最適化
デプロイ前に、アプリを最適化しましょう。
ビルドサイズを確認しよう
まず、ビルドサイズを確認してみましょう。
npm run build
ビルドが完了すると、こんな感じの結果が表示されます。
File sizes after gzip:
41.23 KB build/static/js/main.12345678.js
1.78 KB build/static/css/main.87654321.css
この数字が大きすぎる場合は、最適化が必要です。
バンドルサイズを分析しよう
何が容量を占めているか分析するには、webpack-bundle-analyzer
を使います。
npm install --save-dev webpack-bundle-analyzer
package.json
にスクリプトを追加します。
{
"scripts": {
"analyze": "npm run build && npx webpack-bundle-analyzer build/static/js/*.js"
}
}
そして、分析を実行します。
npm run analyze
ブラウザで分析結果が表示されます。
大きなライブラリが見つかったら、本当に必要か確認してみましょう。
不要なパッケージを削除しよう
使っていないパッケージを確認するには、depcheck
を使います。
npx depcheck
未使用のパッケージが表示されたら、削除しましょう。
npm uninstall 不要なパッケージ名
これで、ビルドサイズを削減できます。
画像を最適化しよう
画像は、アプリのサイズに大きく影響します。
適切なサイズに変換して、WebP形式を使うことをおすすめします。
function OptimizedImage() {
return (
<img
src="/images/photo-small.jpg"
srcSet="/images/photo-small.jpg 320w,
/images/photo-medium.jpg 768w,
/images/photo-large.jpg 1024w"
sizes="(max-width: 320px) 280px,
(max-width: 768px) 720px,
1024px"
alt="最適化された画像"
loading="lazy"
/>
);
}
srcSet
とsizes
を使うことで、デバイスに応じて最適な画像が表示されます。
loading="lazy"
を追加すると、画像の遅延読み込みが有効になります。
環境変数を設定しよう
環境別に設定を変えたい場合は、環境変数を使います。
const config = {
apiUrl: process.env.REACT_APP_API_URL || 'http://localhost:3001',
debug: process.env.NODE_ENV !== 'production'
};
export default config;
各デプロイサービスで、環境変数を設定してください。
Netlify、Vercel、GitHub Actionsすべてで対応しています。
よくあるトラブルと解決方法
デプロイ時に起こりやすい問題を紹介します。
1. ビルドエラーで止まる
問題:npm run build
でエラーが出る
解決方法:警告をエラーとして扱わない設定を追加
{
"scripts": {
"build": "CI=false react-scripts build"
}
}
CI=false
を追加することで、警告でビルドが止まらなくなります。
2. ページにアクセスすると404エラー
問題:/about
にアクセスすると404エラーが出る
解決方法:各サービスに応じた設定を追加
Netlify:public/_redirects
ファイルを作成
/* /index.html 200
Vercel:vercel.json
ファイルを作成
{
"routes": [
{ "src": "/(.*)", "dest": "/index.html" }
]
}
GitHub Pages:HashRouter
を使用
import { HashRouter } from 'react-router-dom';
3. 環境変数が読み込まれない
問題:process.env.REACT_APP_API_URL
がundefined
になる
解決方法:正しいプレフィックスを使用
# ✅ 正しい
REACT_APP_API_URL=https://api.example.com
# ❌ 間違い
API_URL=https://api.example.com
Reactアプリでは、REACT_APP_
プレフィックスが必要です。
4. 画像やファイルが表示されない
問題:画像が表示されない
解決方法:正しいパスを使用
// ❌ 間違い
<img src="/images/photo.jpg" alt="写真" />
// ✅ 正しい方法1:インポート
import photo from '../images/photo.jpg';
<img src={photo} alt="写真" />
// ✅ 正しい方法2:publicフォルダ
<img src={process.env.PUBLIC_URL + '/images/photo.jpg'} alt="写真" />
5. デプロイが遅い
問題:デプロイに時間がかかる
解決方法:不要なファイルを除外
.gitignore
に以下を追加:
node_modules/
build/
.env.local
.env.development.local
.env.test.local
.env.production.local
また、package-lock.json
を削除せずに、キャッシュを活用しましょう。
6. CORSエラーが出る
問題:APIへのアクセスでCORSエラーが出る
解決方法:開発時はプロキシを設定
{
"proxy": "http://localhost:3001"
}
本番環境では、バックエンド側でCORSの設定が必要です。
app.use(cors({
origin: ['https://myapp.netlify.app', 'https://myapp.vercel.app'],
credentials: true
}));
セキュリティ対策も忘れずに
デプロイ時のセキュリティ対策について説明します。
環境変数の適切な管理
絶対にやってはいけないこと:
// ❌ 危険:秘密情報をコードに含める
const API_SECRET = 'secret-key-123';
Reactアプリは、ブラウザで動作するため、すべてのコードが公開されます。
安全な方法:
// ✅ 安全:公開しても問題ない情報のみ
const API_URL = process.env.REACT_APP_API_URL;
const APP_VERSION = process.env.REACT_APP_VERSION;
秘密情報は、バックエンド側で管理しましょう。
HTTPS化の確認
現在のデプロイサービスは、すべて自動的にHTTPS化されます。
でも、念のため確認してみましょう。
// HTTPS化の強制(必要に応じて)
if (location.protocol !== 'https:' && location.hostname !== 'localhost') {
location.replace(`https:${location.href.substring(location.protocol.length)}`);
}
依存関係のセキュリティ確認
定期的に、セキュリティ脆弱性を確認しましょう。
npm audit
問題が見つかったら、修正します。
npm audit fix
手動での対応が必要な場合は、パッケージのアップデートを検討してください。
CSP(Content Security Policy)の設定
より高度なセキュリティ対策として、CSPを設定できます。
<!-- public/index.html -->
<meta http-equiv="Content-Security-Policy"
content="default-src 'self';
script-src 'self' 'unsafe-inline';
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;">
この設定により、悪意のあるスクリプトの実行を防げます。
まとめ
Reactアプリの無料デプロイ方法について、詳しく解説しました。
重要なポイント
- 3つの選択肢があり、それぞれに特徴がある
- 用途に応じて最適なサービスを選ぶ
- デプロイ前の最適化が重要
- セキュリティ対策も忘れずに
サービス選択の指針
- GitHub Pages:学習目的やシンプルなポートフォリオ
- Netlify:フォーム機能が必要なサイト
- Vercel:高性能が求められるアプリ
次のステップ
まずは、一番簡単なGitHub Pagesから始めてみませんか?
慣れてきたら、NetlifyやVercelも試してみてください。
どのサービスも無料プランが充実しているので、気軽に試せるのが嬉しいですね。
あなたのReactアプリが、世界中の人に見てもらえる日が楽しみです!
ぜひこのガイドを参考に、デプロイに挑戦してみてください。