今天要把昨天規劃好的 public/manifest.json 和 public/sw.js 實際寫出來,讓專案具備 PWA 的基本資格。
在 public/manifest.json 建立以下內容:
{
"name": "SyncETA Lite",
"short_name": "SyncETA",
"description": "智慧出發時間推薦 PWA",
"start_url": "/",
"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 是關鍵設定,它讓安裝後的網頁不顯示瀏覽器網址列,看起來就像一個獨立 App。
打開 index.html,在 <head> 內加入:
<link rel="manifest" href="/manifest.json" />
<meta name="theme-color" content="#2563eb" />
在 public/sw.js 先寫一個最陽春的版本(之後 Day 21 會補上完整的快取邏輯):
// public/sw.js
self.addEventListener('install', (event) => {
console.log('SyncETA Service Worker 安裝完成');
});
self.addEventListener('fetch', (event) => {
// 目前先不攔截請求,之後會加入快取策略
});
// src/main.js
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js')
.then(() => console.log('Service Worker 註冊成功'))
.catch((err) => console.error('註冊失敗', err));
});
}
PWA 的 Service Worker 只能在 HTTPS 環境下運作(localhost 開發時例外,瀏覽器會放行)。
之後 Day 26 部署上線時,我們會用 Vercel,它預設就提供 HTTPS,不用額外設定憑證,對初學者非常友善。
這樣,我們的 PWA 三要素就都齊備了。明天要做的事情,就是把這個空殼子跑起來,並確認瀏覽器真的能把它「安裝」到主畫面。