実際に作業したリポジトリはこちらで公開しています。
Wrangler CLI を使ったデプロイ方法を中心に、ローカルでの開発環境についても触れていきますので、同様の構成で開発されている方の参考になれば幸いです。
なぜCloudflare Pagesなのか
個人開発や小規模なプロジェクトでフロントエンドをホスティングする際、手軽さとパフォーマンスが重要になります。Cloudflare Pagesは、静的サイトのホスティングサービスとして非常に強力で、グローバルなCDN配信や簡単なデプロイフローを提供してくれます。
今回は、AstroとSvelteを使ったモダンな構成のプロジェクトを、コマンドライン(Wrangler CLI)ベースで効率的にデプロイする手順を確立したいと考え、検証を行いました。
デプロイ手順について
最終的には、以下の3つのデプロイ方法をスムーズに使い分けられる状態を目指しました。
- Wrangler CLIによる手動デプロイ: ローカルからコマンド一つで本番・プレビュー環境へデプロイします。
- GitHub連携による自動デプロイ:
main
ブランチへのプッシュをトリガーに自動でデプロイします。 - ローカルでの互換環境テスト: デプロイ前に、Cloudflare Pagesの実行環境をローカルで再現して確認します。
この記事では、特に Wrangler CLI を使ったセットアップとデプロイフローに焦点を当てて解説します。
デプロイに向けた設定変更
まず、AstroプロジェクトをCloudflare Pagesにデプロイするために、いくつかの設定ファイルを追加・変更しました。変更後の最終的なファイルは以下の通りです。
1. astro.config.mjs の設定
Cloudflare Pagesは静的サイトホスティングなので、Astroの出力をstatic
に指定し、サイトURLなどを設定しました。
import { defineConfig } from "astro/config";
import svelte from "@astrojs/svelte";
import tailwindcss from "@tailwindcss/vite";
// https://astro.build/config
export default defineConfig({
integrations: [svelte()],
output: "static",
build: {
format: "file",
inlineStylesheets: "auto",
},
site: "https://svelte-study-frontend.pages.dev",
vite: {
plugins: [tailwindcss()],
build: {
target: "es2020",
cssCodeSplit: true,
rollupOptions: {
output: {
manualChunks: {
vendor: ["svelte"],
},
},
},
},
},
});
2. package.json の設定
Wrangler CLIを使ったデプロイ操作を簡単にするためのスクリプトを追加しました。また、wrangler
パッケージ自体もdevDependencies
に含めています。
{
"name": "frontend",
"type": "module",
"version": "0.0.1",
"scripts": {
"dev": "astro dev",
"build": "astro build",
"preview": "astro preview",
"astro": "astro",
"deploy": "wrangler pages deploy dist",
"deploy:preview": "wrangler pages deploy dist --branch preview",
"cf:dev": "wrangler pages dev dist"
},
"dependencies": {
"@astrojs/svelte": "^7.1.0",
"astro": "^4.14.0",
"svelte": "^5.0.0-next.203",
"tailwindcss": "^4.0.0-alpha.17",
"typescript": "^5.8.3"
},
"devDependencies": {
"sass": "^1.89.2",
"wrangler": "^4.20.0"
}
}
3. wrangler.toml の作成
Wranglerがプロジェクトを認識するための設定ファイルです。プロジェクト名やビルド出力先ディレクトリを指定します。
name = "svelte-study-frontend"
compatibility_date = "2024-06-15"
pages_build_output_dir = "dist"
4. _headers ファイルでキャッシュ設定を最適化
Cloudflare Pagesでは、_headers
というファイルをpublic
ディレクトリに配置することで、配信されるファイルにHTTPヘッダーを付与できます。今回は、静的アセットに長期間のブラウザキャッシュを設定し、パフォーマンス向上を図りました。
# Cloudflare Pages Headers Configuration
# Basic security and performance headers
/*
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Cache-Control: public, max-age=3600
# Static assets - longer cache
/assets/*
Cache-Control: public, max-age=31536000, immutable
# JavaScript and CSS files
/*.js
Cache-Control: public, max-age=31536000, immutable
/*.css
Cache-control: public, max-age=31536000, immutable
Wrangler CLIによるデプロイ手順
ここからは、実際にWrangler CLIを使ってプロジェクトをデプロイする手順をステップバイステップで解説します。
1. 前提条件
作業を始める前に、ローカル環境に以下のツールがインストールされていることを確認しましょう。
- Node.js (v18以上)
- pnpm
- Cloudflare アカウント
2. Wrangler CLI操作
まず、プロジェクトにWrangler CLIをインストールし、Cloudflareアカウントにログインします。
# プロジェクトのフロントエンドディレクトリに移動
cd frontend
# 依存関係をインストール
pnpm install
# Wrangler CLIをローカルにインストール(推奨)
pnpm add -D wrangler
# Wrangler CLI経由でCloudflareにログイン
npx wrangler login
npx wrangler login
を実行すると、ブラウザが自動で開き、Cloudflareへのログインと認証を求められます。認証が成功すると、ターミナルに「Successfully logged in.」と表示されました。
⛅️ wrangler 4.20.0
───────────────────
Attempting to login via OAuth...
Opening a link in your default browser: https://dash.cloudflare.com/oauth2/auth?response_type=code&client_id=xxxxx...
Successfully logged in.
3. Cloudflare Pagesプロジェクトの作成
次に、デプロイ先となるCloudflare Pagesのプロジェクトをコマンドで作成します。
npx wrangler pages project create svelte-study-frontend
実行すると、PRDのブランチ名を聞かれます。今回はmain
ブランチを本番環境としたかったので、main
と入力しました。
⛅️ wrangler 4.20.0
───────────────────
✔ Enter the production branch name: … main
✨ Successfully created the 'svelte-study-frontend' project.
It will be available at https://svelte-study-frontend.pages.dev/ once you create your first deployment.
これで、Cloudflare上にデプロイを受け付けるためのプロジェクトが作成されました。
4. プロジェクトのビルドとデプロイ
いよいよデプロイです。まずAstroプロジェクトをビルドし、dist
ディレクトリに静的ファイルを生成します。その後、package.json
に定義したスクリプトを実行してデプロイします。
# プロジェクトをビルド
pnpm run build
# 本番環境へデプロイ
pnpm run deploy
pnpm run deploy
を実行すると、wrangler pages deploy dist
が実行され、ビルド結果がアップロードされます。
> [email protected] deploy /path/to/frontend
> wrangler pages deploy dist
⛅️ wrangler 4.20.0
───────────────────
✨ Success! Uploaded 12 files (1.64 sec)
🌎 Deploying...
✨ Deployment complete! Take a peek over at https://xxxxxxxx.svelte-study-frontend.pages.dev
✨ Deployment alias URL: https://branch-name.svelte-study-frontend.pages.dev
成功すると、2種類のURLが表示されました。これが少し分かりにくかったので、以下に整理します。
プレビューURL
https://xxxxxxxx.svelte-study-frontend.pages.dev
xxxxxxxx
の部分はデプロイごとに生成されるランダムなハッシュ値です。- このURLは、その特定のデプロイバージョンを指し示す固定のURLとなります。
エイリアスURL
https://branch-name.svelte-study-frontend.pages.dev
- 現在のgitブランチ名(今回は
feature-cloudflare
)が付与されたURLです。 - このURLにアクセスすると、そのブランチの 最新のデプロイ が表示されます。CI/CDなどで非常に便利だと感じました。
本番URL
https://svelte-study-frontend.pages.dev
- これは、プロジェクト作成時に指定したPRDブランチ(
main
)からデプロイした場合にのみ、コンテンツが反映されるURLです。
その他のデプロイ・開発手法
Wrangler CLIを使った手動デプロイ以外にも、いくつかの便利な使い方がありましたので紹介します。
プレビュー環境へのデプロイ
本番とは別の環境で動作確認をしたい場合、--branch
オプションを使うことで、独立したプレビュー環境を簡単に作成できました。
# プレビュー用のデプロイスクリプトを実行
pnpm run deploy:preview
このコマンドは wrangler pages deploy dist --branch preview
を実行し、preview
という名前のブランチとしてデプロイします。結果として、https://preview.svelte-study-frontend.pages.dev
のような専用のエイリアスURLが生成され、本番環境に影響を与えることなくテストができました。
ローカル開発サーバー(Cloudflare互換)
デプロイ前に、Cloudflare Pagesのランタイム環境をローカルでシミュレートすることも可能です。
# ビルド成果物を元にCloudflare互換サーバーを起動
pnpm run cf:dev
このコマンド (wrangler pages dev dist
) を実行すると、http://localhost:8788
でサーバーが起動します。これはAstroのプレビューサーバー (pnpm run preview
) とは異なり、_headers
ファイルや、もしあればPages Functionsの動作も再現してくれるため、より本番に近い環境での最終確認に役立ちました。
トラブルシューティング
作業中、いくつか躓いた点もありましたので共有します。
pnpm install
後にビルドすると、依存関係のエラーが発生することがありました。
pnpm store prune
でpnpmのローカルキャッシュをクリアした後、pnpm install --frozen-lockfile
を実行することで、依存関係がクリーンな状態になり、解決しました。
まとめ
今回の一連の作業を通して、Wrangler CLI を活用することで、AstroプロジェクトをCloudflare Pagesへ非常に効率的にデプロイできることが分かりました。特に、package.json
にスクリプトをまとめておくことで、誰でも簡単にビルドからデプロイまでを実行できるようになった点は大きな収穫でした。
また、プレビューデプロイやローカルでの互換サーバーなど、開発サイクルをサポートする機能が充実している点もCloudflare Pagesの魅力だと改めて感じました。