ข้ามไปยังเนื้อหา

SvelteKit PWA Setup

แพ็กเกจ @vite-pwa/sveltekit ห่อ Workbox ไว้ใน Vite plugin ที่เชื่อมกับ build pipeline ของ SvelteKit โดย plugin ตัวนี้สร้าง service worker, ฉีด precache manifest, และสร้าง web app manifest — ทั้งหมดนี้จาก plugin call เดียว

Terminal window
npm install -D @vite-pwa/sveltekit

เปิด (หรือสร้าง) vite.config.ts ที่ root ของโปรเจกต์ และเพิ่ม SvelteKitPWA ต่อจาก sveltekit():

import { sveltekit } from '@sveltejs/kit/vite';
import { SvelteKitPWA } from '@vite-pwa/sveltekit';
import { defineConfig } from 'vite';
export default defineConfig({
plugins: [
sveltekit(),
SvelteKitPWA({
registerType: 'autoUpdate',
manifest: {
name: 'My SvelteKit App',
short_name: 'SK App',
description: 'An offline-capable SvelteKit PWA',
theme_color: '#ff3e00',
background_color: '#ffffff',
display: 'standalone',
start_url: '/',
icons: [
{
src: '/pwa-192x192.png',
sizes: '192x192',
type: 'image/png',
},
{
src: '/pwa-512x512.png',
sizes: '512x512',
type: 'image/png',
},
],
},
}),
],
});

ควบคุมวิธีที่ service worker จัดการกับการอัปเดต:

ค่าพฤติกรรม
'autoUpdate'SW ใหม่ activate ทันทีหลัง install — ไม่มี prompt
'prompt'SW ใหม่รอ; โค้ด UI ของคุณตัดสินใจว่าจะ apply การอัปเดตเมื่อใด

สำหรับแอป production ส่วนใหญ่ 'prompt' ปลอดภัยกว่า — ป้องกันการ mismatch asset ในช่วงกลาง session

Plugin ฉีด manifest.webmanifest เข้าไปใน build output และเพิ่ม tag <link rel="manifest"> ไปยังทุกหน้า ฟิลด์ name, icons, และ theme_color เป็นข้อกำหนดสำหรับเกณฑ์การติดตั้งของ Chrome

ค่า default คือ 'generateSW' — plugin สร้าง service worker ที่ขับเคลื่อนด้วย Workbox ให้โดยอัตโนมัติ เปลี่ยนเป็น 'injectManifest' เมื่อคุณต้องการเขียน SW logic เองและต้องการให้ Workbox ฉีดเฉพาะ precache list:

SvelteKitPWA({
strategies: 'injectManifest',
srcDir: './src',
filename: 'my-sw.ts',
injectManifest: {
injectionPoint: 'self.__WB_MANIFEST',
globPatterns: ['client/**/*.{js,css,ico,png,svg,webp}'],
},
})

ไฟล์ SW ของคุณต้องมี injection point self.__WB_MANIFEST — Workbox จะแทนที่ด้วย precache list ที่สร้างขึ้นในขั้นตอน build

หากคุณต้องการไฟล์ static แทนการสร้างอัตโนมัติ ให้วาง manifest.webmanifest ไว้ในไดเรกทอรี static/ และข้ามตัวเลือก manifest ใน plugin SvelteKit จะคัดลอกทุกอย่างใน static/ ไปยัง build output โดยตรง

{
"name": "My SvelteKit App",
"short_name": "SK App",
"start_url": "/",
"display": "standalone",
"theme_color": "#ff3e00",
"background_color": "#ffffff",
"icons": [
{ "src": "/pwa-192x192.png", "sizes": "192x192", "type": "image/png" },
{ "src": "/pwa-512x512.png", "sizes": "512x512", "type": "image/png" }
]
}
ตัวเลือกBenefitCost
ใช้ @vite-pwa/sveltekitตั้งค่า manifest+service worker ให้พร้อมใช้ในคำสั่งเดียว เข้ากับ adapter ของ SvelteKitผูกกับ ecosystem เฉพาะ ต้องตามอัปเดต plugin แยกจาก SvelteKit เอง
เขียน setup เองแบบผสม $service-worker module ตรงๆควบคุมทุกรายละเอียดโดยไม่ผ่าน pluginต้อง integrate กับ adapter (static/node/vercel) เองทั้งหมด เพิ่ม edge case
  • ตั้งค่า plugin โดยไม่เช็คว่า adapter ที่ใช้อยู่ (adapter-static, adapter-node ฯลฯ) รองรับ service worker แบบที่ต้องการหรือไม่
  • ลืมเปิด devOptions.enabled: true แล้วสับสนว่าทำไม service worker ไม่ register ตอน dev
  • ไม่ทดสอบบน production build (vite build && vite preview) ทำให้พลาด bug ที่เกิดเฉพาะตอน build จริงเท่านั้น

💡 ตัวอย่างจากของจริง

Vite PWA ecosystem@vite-pwa/sveltekit เป็นส่วนหนึ่งของ ecosystem เดียวกับ Elk (Mastodon client) ที่พอร์ตแนวคิดเดียวกันมาใช้กับ SvelteKit

SvelteKit community starter templates — หลายเทมเพลตใช้ plugin นี้เป็นจุดเริ่มต้นมาตรฐานสำหรับทำ SvelteKit PWA

คุณเพิ่ม SvelteKitPWA() ไว้ที่ไหนในโปรเจกต์ SvelteKit?
ค่า registerType ใดที่ทำให้ SW ใหม่ activate ทันทีโดยไม่มี prompt?
strategy แบบ injectManifest ต้องการอะไรในไฟล์ custom service worker ของคุณ?
ค่า default ของ strategies คืออะไรเมื่อไม่ได้ตั้งค่าอย่างชัดเจน?