PWA 実践:ツールサイトをインストール可能・オフライン対応に
技术架构(更新: 2026年5月27日)
PWA とは?
PWA(Progressive Web App)は Web アプリにネイティブアプリに近い体験を与えます:
| 機能 | 従来の Web | PWA |
|---|---|---|
| ホーム画面への追加 | ❌ | ✅ Add to Home Screen |
| オフラインアクセス | ❌ | ✅ Service Worker キャッシュ |
| プッシュ通知 | ❌ | ✅ Push API |
| フルスクリーン | ❌ | ✅ standalone モード |
| 自動更新 | ✅ | ✅ バックグラウンドで SW 更新 |
ToolsKu のような高頻度で使うツールサイトでは、PDF 結合や JSON 整形などをネイティブアプリのようにワンタップで開けます。
Web App Manifest
manifest.json はインストール情報を定義します:
{
"name": "ToolsKu - オンラインツール集",
"short_name": "ToolsKu",
"start_url": "/ja/",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#2563eb",
"icons": [
{ "src": "/icons/icon-192.png", "sizes": "192x192", "type": "image/png" },
{ "src": "/icons/icon-512.png", "sizes": "512x512", "type": "image/png" }
]
}
| フィールド | 役割 |
|---|---|
display: standalone |
ブラウザのアドレスバーを非表示 |
start_url |
インストール後に開くページ |
theme_color |
ステータス/タイトルバーの色 |
icons |
ホーム画面アイコン(192px と 512px 以上) |
Service Worker のキャッシュ戦略
キャッシュ優先(ツールの静的リソース)
// 向く用途:あまり変わらない JS/CSS/WASM/フォント
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.match(event.request).then(cached => {
return cached || fetch(event.request).then(response => {
const clone = response.clone();
caches.open('static-v1').then(cache => cache.put(event.request, clone));
return response;
});
})
);
});
ネットワーク優先(HTML ページ)
// 向く用途:更新されうる HTML
event.respondWith(
fetch(event.request).catch(() => caches.match(event.request))
);
ToolsKu のキャッシュ階層
| リソース | 戦略 | TTL |
|---|---|---|
_next/static/** |
Cache First | 1 年(hash ファイル名) |
*.wasm |
Cache First | 1 年 |
*.html |
Network First | 1 時間 |
| i18n JSON | Stale While Revalidate | 1 日 |
オフライン時のツール UX
PWA がオフラインのときの UX 設計:
ユーザーがオフラインで ToolsKu を開く
↓
Service Worker がキャッシュした HTML/JS/CSS を返す
↓
ツールページが読み込まれる(SSG で事前レンダーした HTML)
↓
Client Component が起動し、ツールロジックはローカルで実行
↓
File API / WASM でファイル処理 → 完全オフライン
ToolsKu のコアツール(PDF、画像、JSON、暗号)はすべてブラウザのローカル API ベースで、もともとオフライン対応です。PWA では静的リソースをキャッシュすれば十分です。
インストールプロンプトのベストプラクティス
let deferredPrompt: BeforeInstallPromptEvent;
window.addEventListener('beforeinstallprompt', (e) => {
e.preventDefault();
deferredPrompt = e;
showInstallBanner(); // カスタムインストール UI
});
installButton.addEventListener('click', async () => {
deferredPrompt.prompt();
const { outcome } = await deferredPrompt.userChoice;
if (outcome === 'accepted') hideInstallBanner();
});
注意:インストール促しは早すぎないでください。2〜3 個のツールを成功利用したあとに出すとコンバージョンが高くなります。
まとめ
PWA はツールサイトのリテンション向上に有効です。Web App Manifest がインストール入口、Service Worker がオフラインキャッシュを担い、ToolsKu のブラウザ内処理アーキテクチャにより、オフラインでもオンラインと同じ体験が得られます。
ブラウザローカルツールを無料で試す →
#PWA#Service Worker#离线#Web App Manifest#安装