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

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/sveltekit เป็นส่วนหนึ่งของ Vite PWA ecosystem เดียวกับที่ Elk (Mastodon client) พอร์ตแนวคิดเดียวกันมาใช้บน SvelteKit และเทมเพลต starter ของชุมชน SvelteKit หลายตัวก็ใช้ plugin นี้เป็นจุดเริ่มต้นมาตรฐานสำหรับทำ SvelteKit PWA

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