Zenn
Closed24

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

nanasinanasi

バックエンドが存在しない小規模なWebアプリにて、よく使っている手法。

使う技術スタック

開発

  • React v18
  • Vite
  • TailwindCSS v4 + Tailwind Variants

デプロイ

  • GitHub Pages
  • GitHub Actions

共通

  • Bun(GitHub Actionsでも使用)
  • パッケージマネージャーもBun

特徴

良い点

  • 無料で半永久的に運用可能 -> 手軽
  • GitHubにpushするだけでデプロイが始まる
  • どの技術も情報が豊富

悪い点

  • (GitHubフリープランの場合?)ソースコードを公開する必要がある
nanasinanasi

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>
  )
}

ちゃんと設計すればなくても行けるかもしれないけど、設計なしで作る小規模サービスなら入れて損はないと思う。

https://www.tailwind-variants.org

nanasinanasi

GitHub Pages は静的サイト ホスティング サービスです。これを使って、GitHub のリポジトリから HTML、CSS、JavaScript ファイルを直接取得し、任意でビルド プロセスを通じてファイルを実行し、Web サイトを公開することができます。

GitHub Pagesは無料でWebサイトを公開できる優れもの。
サーバー代どころかドメイン代も不要で、とてもお財布に優しい。

ただデメリットもある。

  • ソースコードをGitHubで公開する必要がある
  • 商用利用はNG
  • サイトの容量は1GB未満の必要がある

https://docs.github.com/ja/pages/getting-started-with-github-pages/about-github-pages

nanasinanasi

手順

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

1. Viteを初期化

TailwindCSS + React + Viteを組み合わせているテンプレートは多数あるけど、ちょうどいいものが見つからない場合は普通にやったほうがいい。

https://ja.vite.dev/guide/#最初の-vite-プロジェクトを生成する

nanasinanasi

また、不要なファイルも消しておく。
画像ファイルや、App.tsxの内容も書き換えておく。

nanasinanasi

2. TailwindCSS v4を初期化

最近(2025/1/22)v4.0が公開されて、初期化がだいぶやりやすくなった。
パフォーマンスも向上したらしい?

初期化はReactというよりViteに導入する形。

https://tailwindcss.com/docs/installation/using-vite

nanasinanasi

v3からの変更点

Viteに追加する方法もv3からだいぶ変わってるので、軽く変更点を書いておく。

  • CSSは@import "tailwindcss";1行でOK
  • @tailwindcss/viteというViteプラグインの追加
nanasinanasi

3. GitHub Actionsのワークフローを追加する

Webサイトとして表示するには、ビルドしたものを公開する必要がある。
ということでGitHub Actionsを使い、GitHubにプッシュしたらビルド & デプロイされるようにする。

ワークフローは.github/workflowsに置く。
内容:
https://github.com/nanasi-1/hunter-mozi-converter/blob/main/.github/workflows/deploy-gh-pages.yml

nanasinanasi

bun run build --base=/***について:

--baseオプションにはGitHubのリポジトリ名を指定する。
これはビルド後のアセットのパスに使われる。
しっかり指定しないと、JavaScriptとか画像が読み込まれないこともある。

なお、これはvite.config.tsbaseオプションでも設定できる。
ただGitHub Actionsに書いておくとこの環境でのみ適用されるので、ローカルでビルドをテストしたいときとかに楽だと思う。

nanasinanasi

ワークフローでやっていること

このワークフローはmainブランチにpushされると実行される。
また、builddeployというジョブに分けられている。

ビルド

  1. GitHub Pagesをセットアップする(actions/configure-pages@v5
  2. Bunをセットアップする(oven-sh/setup-bun@v1
    • 開発環境とランタイムを揃えることで、ビルド環境でのみのエラーが減るはず
    • Bunはパッケージマネージャーとしても使う
  3. 依存関係をインストールする(bun install
  4. ビルドする=ビルド結果を./distに出力する(bun run build --base=/<repo-name>
  5. ./dist=ビルド結果をアーティファクトとしてアップロードする
nanasinanasi

4. GitHubのリポジトリを作る

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

nanasinanasi

前述の通り、リポジトリ名はワークフローの--baseに合わせること。
また、公開されたサイトURLはhttps://<username>.github.io/<repo-name>となる。

nanasinanasi

また、リポジトリはpublicで作る必要がある。
ただしProプランの場合はこの限りではない。(詳細

nanasinanasi

(ワークフローのファイルを追加する前にGitHub Pagesの設定済ませたほうが良いか...?)

nanasinanasi

5. GitHub Pagesの設定する

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

nanasinanasi

これでたぶんデプロイが始まる?
始まってたら1分くらい待って、サイトを訪問して表示チェック。

nanasinanasi

始まらなかったらワークフローを再実行する。
Actionsタブからできるはず。

nanasinanasi

おまけ: OGPの設定

X(Twitter)にもOGPを設定したい場合、twitter:imageも入れよう。
また、同時にtwitter:titleとかtwitter:descriptionも入れよう。
そうじゃないとTwitterで表示されないっぽい?

ちなみにTwitter向けデバッグはTwitter Card Varidatorがおすすめ。
その他のサイトひっくるめた表示確認ならラッコツールズのが有能。
また、Chrome拡張機能(名前忘れた)を使うとlocalhostのサイトが(一部)公開されるので、上述のラッコツールズとかで表示確認できるようになる。便利。

あとは画像URLはURLまるごと設定しよう。

という感じで、GitHub Pagesだからこうとかいうのはないと思う。

nanasinanasi

おまけ: Google検索

放っておいてもインデックスされないので、Google Search Consoleから登録する必要がある。

認証はmetaタグでやると楽。
index.htmlhead内にコピーしたmetaタグを追加するだけ。

サイトマップもあわせて登録する必要があるって情報もあるけど、たぶんなくても行ける。
ページ数がたくさんある場合はこの限りではない?

このスクラップは14日前にクローズされました
ログインするとコメントできます