问题
最近发现了一个奇怪的 bug,在笔记项目rhomb
从svelte
迁移到sveltekit
后,PWA
功能失效了。
导致在tauri
中打包后的网页,在每次打开时都会登录错误。
在清除tauri
的缓存和service worker
后,发现问题依然存在,并且service worker
也无法注册。
最后发现是vite-pwa
插件和SvelteKit
的自带PWA
功能冲突导致的。需要重新配置vite-pwa
插件。
简介
vite-pwa
是一个用于在Vite
项目中添加PWA
功能的插件。
针对SvelteKit
项目,有一个专门的子项目vite-pwa/sveltekit
。
安装
pnpm add -D @vite-pwa/sveltekit
配置
在SvelteKit
中的配置
在SvelteKit
中的svelte.config.js
里需要取消生成自带的PWA
配置文件service-worker.js
。
import adapter from "@sveltejs/adapter-static";
import { vitePreprocess } from "@sveltejs/vite-plugin-svelte";
import preprocessReact from "svelte-preprocess-react/preprocessReact";
/** @type {import('@sveltejs/kit').Config} */
const config = {
kit: {
adapter: adapter({
fallback: "index.html", // may differ from host to host
}),
serviceWorker: {
register: false, // 取消生成 service-worker.js
},
},
preprocess: [vitePreprocess(), preprocessReact()],
};
export default config;
在Vite
中的配置
在Vite
中的vite.config.js
里添加vite-pwa
插件。
// vite.config.js / vite.config.ts
import { SvelteKitPWA } from "@vite-pwa/sveltekit";
/** @type {import('vite').UserConfig} */
const config = {
plugins: [
sveltekit(),
SvelteKitPWA({
/* pwa options */
}),
],
};
export default config;
在SvelteKit
中添加注册 service worker
在SvelteKit
中的src/routes/++layout.svelte
里添加注册service worker
的代码。
<script>
import { pwaInfo } from "virtual:pwa-info";
import { onMount } from "svelte";
onMount(async () => {
if (pwaInfo) {
const { registerSW } = await import("virtual:pwa-register");
registerSW({
immediate: true,
onRegistered(r) {
// uncomment following code if you want check for updates
// r && setInterval(() => {
// console.log('Checking for sw update')
// r.update()
// }, 20000 /* 20s for testing purposes */)
console.log(`SW Registered: ${r}`);
},
onRegisterError(error) {
console.log("SW registration error", error);
}
});
}
});
</script>