【IT】Cloudflare Pages へのデプロイ手順(PWA + 手動 Service Worker 登録)
皆さま
こんにちは
本日は、作成したWebアプリを
Cloudflare Pagesへデプロイします。
今回の環境は、
PC:MacBook Air(M1)
フレームワーク:SvelteKit V5
前回のアプリケーションのPWA化は、以下を参照ください。
・第1回目:事前準備編
・第2回目:SvelteKitの設定編
・第3回目:動作確認(ローカル、ディプロイ)編
以下の手順では、`vite-plugin-pwa` の自動挿入フックが SvelteKit 環境で動かないことを踏まえ、手動で `registerSW.js` を読み込む方式を採用します。
1. 前提条件
SvelteKit プロジェクトで `@sveltejs/adapter-static` を使用
PWA は `vite-plugin-pwa (generateSW)` で設定済み
GitHub リポジトリ用意済み
Cloudflare アカウント作成済み
2. GitHub リポジトリへの Push
GitHubのリポジトリへ対象のアプリをPushします。
※ 既に Push 済みならスキップください。
git init
git add .
git commit -m "Deploy to Cloudflare Pages"
git remote add origin https://github.com/<あなたのユーザー名>/<リポジトリ名>.git
git push -u origin main3. SvelteKit & VitePWA 設定
以下の設定ファイルを編集して修正します。
3.1 `svelte.config.js`
import adapter from '@sveltejs/adapter-static';
import { vitePreprocess } from '@sveltejs/kit/vite';
export default {
preprocess: vitePreprocess(),
kit: {
adapter: adapter({ fallback: 'index.html' }),
prerender: { entries: ['*'] }
}
};3.2 `vite.config.ts`
import tailwindcss from '@tailwindcss/vite';
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
import { VitePWA } from 'vite-plugin-pwa';
export default defineConfig({
plugins: [
tailwindcss(),
sveltekit(),
VitePWA({
strategies: 'generateSW',
registerType: 'prompt',
injectRegister: 'script',
devOptions: {
enabled: true
},
includeAssets: [
'icons/icon-192.png',
'icons/icon-512.png',
'screenshots/screen1.png',
'screenshots/screen2.png'
],
manifest: {
name: 'アプリ 使用記録',
short_name: 'Apri',
start_url: '/',
display: 'standalone',
background_color: '#ffffff',
theme_color: '#0f766e',
lang: 'ja',
icons: [
{
src: '/icons/icon-192.png',
sizes: '192x192',
type: 'image/png'
},
{
src: '/icons/icon-512.png',
sizes: '512x512',
type: 'image/png'
}
],
screenshots: [
{
src: '/screenshots/screen1.png',
sizes: '540x720',
type: 'image/png',
form_factor: 'wide'
},
{
src: '/screenshots/screen2.png',
sizes: '1280x720',
type: 'image/png',
form_factor: 'narrow'
}
]
},
workbox: {
globPatterns: ['**/*.{js,css,ico,png,svg,json,webmanifest}'],
navigateFallback: undefined,
runtimeCaching: [
{
urlPattern: /^\/$/,
handler: 'NetworkFirst'
},
{
urlPattern: /\.(?:png|jpg|jpeg|svg|webp|gif|ico)$/,
handler: 'CacheFirst'
}
]
}
})
],
build: {
cssCodeSplit: true,
rollupOptions: {
output: {
manualChunks(id) {
// node_modules以下はまとめて 'vendor' chunk に
if (id.includes('node_modules')) {
return 'vendor';
}
// Tailwind や Chart.js のスタイルは 'libs' chunk に
if (id.includes('tailwind') || id.includes('chart.js')) {
return 'libs';
}
// その他はデフォルトの分割に任せる
}
}
}
},
esbuild: {
logOverride: { 'this-is-undefined-in-esm': 'silent' }
}
});3.3. 必要ファイルインストール
以下のファイルのインストールを行います。
※実施済みの場合はスキップください。
(low severity vulnerabilitiesは、今回はリスク低として対応は見送ります)
$ npm install vite-plugin-pwa --save-dev
npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
npm warn deprecated glob@7.2.3: Glob versions prior to v9 are no longer supported
npm warn deprecated sourcemap-codec@1.4.8: Please use @jridgewell/sourcemap-codec instead
added 383 packages, and audited 461 packages in 9s
111 packages are looking for funding
run `npm fund` for details
3 low severity vulnerabilities
To address all issues (including breaking changes), run:
npm audit fix --force
Run `npm audit` for details.$ npm install -D @sveltejs/adapter-vercel
up to date, audited 518 packages in 1s
123 packages are looking for funding
run `npm fund` for details
5 low severity vulnerabilities
To address all issues (including breaking changes), run:
npm audit fix --force
Run `npm audit` for details.4. `registerSW.js` の役割
Service Worker本体(`sw.js`)を登録するブートストラップスクリプト
`skipWaiting()` / `clients.claim()` による 自動更新制御 を含む
オフライン対応や更新通知を簡単に扱える
5. 手動で `registerSW.js` を読み込む方法
自動挿入が効かない場合は、必ず下記のように `src/app.html` に 手動で `<script>` タグを追加します。
※今回h、自動挿入が出来ませんでしたので手動で追加してます。
<!doctype html>
<html lang="ja">
<head>
%sveltekit.head%
<title>アプリ使用記録</title>
</head>
<body data-sveltekit-preload-data="hover">
%sveltekit.body%
<!-- ← ここを手動で追加 -->
<script type="module" src="/registerSW.js" defer></script>
</body>
</html>これで必ず `registerSW.js` が読み込まれ、ブラウザ上で Service Worker の登録が走ります。
6. Cloudflare Pages プロジェクト作成
6.1.プロジェクト作成
Cloudflare ダッシュボード→「Workers & Pages」を選択し、「作成」をクリックします。

6.2. GitHub連携
Pagesを選択し、「既存の Git リポジトリをインポートする」の「始める」をクリックします。
※「Cloudflare Workers を使用することをお勧めします。」とありますが、
今回は、単純なページとなりなりますのでPagesを利用します。

6.3. 対象のレポジトリを選択
今回は、GitHubを使用しまうので選択し、対象のリポジトリを選択し、
「セットアップ開始」をクリックします。

6.4. ビルド & デプロイ設定
以下を設定し、「保存してデプロイする」をクリックします。
・フレームワーク プリセット: SvelteKit
・ビルド コマンド: npm ci && npm run build
・ビルド出力ディレクトリ: build
注意: デフォルトの .svelte-kit/cloudflare ではなく build を指定

6.5. デプロイ確認
”成功しました”のメッセージを確認して「プロジェクトに進む」をクリックします。

6.6. ドメイン名の確認
自動デイプロイが有効であることドメイン名を確認します。

7. 初回デプロイ & 動作確認
7.1. アプケーションへのアクセス
`https://ドメイン名` にアクセスできるか確認します。
次に開発者ツールを開いて「アプリケーション」ー「Service workers」が表示されwているか確認します。
※ドメイン名は、6.6で確認したどメイン名です。

7.2. registerSW.jsの確認
DevTools → Network → `/registerSW.js` が 200 で取得されるか確認します。

7.3. オフラインモードでページ表示
「アプケーション」ー「Service workers」で「オフライン」を選択して
ページが表示されるか確認します。

8. (任意)カスタムドメイン設定
※ドメインを自身でお持ちの方のみ実施できます。
Pages プロジェクト画面 → Custom domains
ドメインを追加 → CNAME レコードを設定
SSL 証明書は自動発行
では
