React + Vite + TailwindCSSで開発→GitHub Pagesでデプロイする

バックエンドが存在しない小規模なWebアプリにて、よく使っている手法。
使う技術スタック
開発
- React v18
- Vite
- TailwindCSS v4 + Tailwind Variants
デプロイ
- GitHub Pages
- GitHub Actions
共通
- Bun(GitHub Actionsでも使用)
- パッケージマネージャーもBun
特徴
良い点
- 無料で半永久的に運用可能 -> 手軽
- GitHubにpushするだけでデプロイが始まる
- どの技術も情報が豊富
悪い点
- (GitHubフリープランの場合?)ソースコードを公開する必要がある

Tailwind Variantsは、TailwindCSSのクラス名の競合を防げるやつ。
普通にclassName="ここにクラス名 {props.className}"
とかやると、props
のクラス名がうまく適用されない可能性があって危険。
なので対策する必要があるが、それにこれが使える。
Tailwind Variantsで提供されているtv
を使うと、同じ種類のクラス名を上書きしてくれる。
ついでにVariantsという機能もあり、便利。
export function Button({ className, disabled, children }: {
className?: string
disabled: boolean
children: React.ReactNode
}) {
const button = tv({
base: "bg-blue-500 text-blue-50 rounded-sm"
variants: {
disabled: { true: "bg-gray-500" }
}
})
return (
<button className={button({ className, disabled })}>{children}</button>
)
}
ちゃんと設計すればなくても行けるかもしれないけど、設計なしで作る小規模サービスなら入れて損はないと思う。

GitHub Pages は静的サイト ホスティング サービスです。これを使って、GitHub のリポジトリから HTML、CSS、JavaScript ファイルを直接取得し、任意でビルド プロセスを通じてファイルを実行し、Web サイトを公開することができます。
GitHub Pagesは無料でWebサイトを公開できる優れもの。
サーバー代どころかドメイン代も不要で、とてもお財布に優しい。
ただデメリットもある。
- ソースコードをGitHubで公開する必要がある
- 商用利用はNG
- サイトの容量は1GB未満の必要がある

手順
- Viteプロジェクトを初期化する
- TailwindCSSとTailwind Variantsを入れる
- GitHub Actionsのワークフローを追加する
- GitHubのリポジトリを作り、コードを上げる
- GitHub Pagesの設定する -> デプロイが始まる?

2. TailwindCSS v4を初期化
最近(2025/1/22)v4.0が公開されて、初期化がだいぶやりやすくなった。
パフォーマンスも向上したらしい?
初期化はReactというよりViteに導入する形。

3. GitHub Actionsのワークフローを追加する
Webサイトとして表示するには、ビルドしたものを公開する必要がある。
ということでGitHub Actionsを使い、GitHubにプッシュしたらビルド & デプロイされるようにする。
ワークフローは.github/workflows
に置く。
内容:

次は公開なので、この時点で多少の開発を済ませておこう。

bun run build --base=/***
について:
--base
オプションにはGitHubのリポジトリ名を指定する。
これはビルド後のアセットのパスに使われる。
しっかり指定しないと、JavaScriptとか画像が読み込まれないこともある。
なお、これはvite.config.ts
のbase
オプションでも設定できる。
ただGitHub Actionsに書いておくとこの環境でのみ適用されるので、ローカルでビルドをテストしたいときとかに楽だと思う。

ワークフローでやっていること
このワークフローはmain
ブランチにpushされると実行される。
また、build
とdeploy
というジョブに分けられている。
ビルド
- GitHub Pagesをセットアップする(
actions/configure-pages@v5
) - Bunをセットアップする(
oven-sh/setup-bun@v1
)- 開発環境とランタイムを揃えることで、ビルド環境でのみのエラーが減るはず
- Bunはパッケージマネージャーとしても使う
- 依存関係をインストールする(
bun install
) - ビルドする=ビルド結果を
./dist
に出力する(bun run build --base=/<repo-name>
) -
./dist
=ビルド結果をアーティファクトとしてアップロードする

4. GitHubのリポジトリを作る
VSCodeのサイドバーの「Branchの発行」が便利。
事前にGitHubでログイン済みの場合、これを使うと一瞬で作成 & プッシュできる。

5. GitHub Pagesの設定する
Settings -> Code and automationにあるPages -> Build and deploymentを設定。
SourceをGitHub Actions
にする。

おまけ: OGPの設定
X(Twitter)にもOGPを設定したい場合、twitter:image
も入れよう。
また、同時にtwitter:title
とかtwitter:description
も入れよう。
そうじゃないとTwitterで表示されないっぽい?
ちなみにTwitter向けデバッグはTwitter Card Varidatorがおすすめ。
その他のサイトひっくるめた表示確認ならラッコツールズのが有能。
また、Chrome拡張機能(名前忘れた)を使うとlocalhost
のサイトが(一部)公開されるので、上述のラッコツールズとかで表示確認できるようになる。便利。
あとは画像URLはURLまるごと設定しよう。
という感じで、GitHub Pagesだからこうとかいうのはないと思う。

これがまさにこの構成。

おまけ: Google検索
放っておいてもインデックスされないので、Google Search Consoleから登録する必要がある。
認証はmeta
タグでやると楽。
index.html
のhead
内にコピーしたmeta
タグを追加するだけ。
サイトマップもあわせて登録する必要があるって情報もあるけど、たぶんなくても行ける。
ページ数がたくさんある場合はこの限りではない?