当前位置: 首页 > news >正文

Vite Plugin PWA – 零配置构建现代渐进式Web应用

概述

vite-plugin-pwa 是一个为 Vite 提供 PWA(Progressive Web Apps)功能的零配置插件。它结合了 Web 和原生应用的优点,为用户提供更优质的应用体验。该插件支持多种框架,包括 Vue、React、Svelte、SolidJS、Preact 等。

主要特性

  • 零配置:为常见用例提供合理的默认配置
  • 可扩展:暴露完整的自定义插件行为能力
  • 类型安全:使用 TypeScript 编写
  • 离线支持:通过 Workbox 生成支持离线的 Service Worker
  • 完全可摇树优化:自动注入 Web App Manifest
  • 新内容提示:内置支持 Vanilla JavaScript、Vue 3、React、Svelte、SolidJS 和 Preact
  • Stale-while-revalidate:当有新内容可用时自动重新加载

安装

# npm
npm install vite-plugin-pwa -D# yarn
yarn add vite-plugin-pwa -D# pnpm
pnpm add vite-plugin-pwa -D

基础使用

配置 Vite

在 vite.config.js 或 vite.config.ts 文件中添加插件:

import { defineConfig } from "vite";
import { VitePWA } from "vite-plugin-pwa";export default defineConfig({plugins: [VitePWA()],
});

类型定义

在 tsconfig.json 中添加类型定义:

{"compilerOptions": {"types": ["vite/client", "vite-plugin-pwa/client"]}
}

或在 vite-env.d.ts 文件中添加:

/// <reference types="vite-plugin-pwa/client" />

注册 Service Worker

在应用入口文件中注册 Service Worker:

import { registerSW } from "virtual:pwa-register";registerSW({// 每小时检查一次更新onRegistered: (r) => r && setInterval(async () => await r.update(), 3600000),// 注册失败时输出错误onRegisterError: (error) => console.error(error),
});

配置选项

基础配置

VitePWA({// 注册类型:'autoUpdate' | 'prompt'registerType: "autoUpdate",// 输入目录srcDir: "./src",// 输出目录outDir: "./dist",// 是否在开发模式下启用devOptions: {enabled: true,},
});

Web App Manifest 配置

VitePWA({manifest: {name: "我的 PWA 应用",short_name: "PWA App",description: "一个使用 Vite Plugin PWA 构建的应用",theme_color: "#ffffff",background_color: "#ffffff",display: "standalone",orientation: "portrait",scope: "/",start_url: "/",icons: [{src: "pwa-192x192.png",sizes: "192x192",type: "image/png",},{src: "pwa-512x512.png",sizes: "512x512",type: "image/png",},{src: "pwa-512x512.png",sizes: "512x512",type: "image/png",purpose: "any maskable",},],},
});

Workbox 配置

VitePWA({workbox: {// 全局模式匹配globPatterns: ["**/*.{css,js,html,svg,png,ico,txt,woff2}"],// 运行时缓存配置runtimeCaching: [{// API 请求缓存urlPattern: ({ url }) => url.pathname.startsWith("/api"),handler: "CacheFirst",options: {cacheName: "api-cache",expiration: {maxEntries: 10,maxAgeSeconds: 60 * 60 * 24, // 1天},cacheableResponse: {statuses: [0, 200],},},},{// 图片缓存urlPattern: /\.(?:png|jpg|jpeg|svg|gif|webp)$/,handler: "CacheFirst",options: {cacheName: "images-cache",expiration: {maxEntries: 60,maxAgeSeconds: 60 * 60 * 24 * 30, // 30天},},},],},
});

框架集成

Vue 3

<script setup>
import { onMounted } from "vue";
import { registerSW } from "virtual:pwa-register";onMounted(() => {registerSW({onNeedRefresh() {console.log("需要刷新");},onOfflineReady() {console.log("应用已准备离线使用");},});
});
</script>

React

import { useEffect } from "react";
import { registerSW } from "virtual:pwa-register";function App() {useEffect(() => {registerSW({onNeedRefresh() {console.log("需要刷新");},onOfflineReady() {console.log("应用已准备离线使用");},});}, []);return <div>我的 PWA 应用</div>;
}

高级配置

自定义 Service Worker

VitePWA({strategies: "injectManifest",srcDir: "src",filename: "sw.ts",workbox: {// 自定义配置},
});

开发模式配置

VitePWA({devOptions: {enabled: true,type: "module",},
});

禁用 PWA 功能

VitePWA({disable: process.env.NODE_ENV === "development",
});

最佳实践

缓存策略选择

  • CacheFirst:适用于静态资源(图片、字体、CSS、JS)
  • NetworkFirst:适用于 API 请求
  • StaleWhileRevalidate:适用于需要实时性的内容

图标配置

确保提供多种尺寸的图标:

icons: [{ src: "icon-192.png", sizes: "192x192", type: "image/png" },{ src: "icon-512.png", sizes: "512x512", type: "image/png" },
];

更新策略

registerSW({onNeedRefresh() {// 显示更新提示if (confirm("发现新版本,是否立即更新?")) {updateSW(true);}},
});

错误处理

registerSW({onRegisterError(error) {console.error("SW 注册失败:", error);},onOfflineReady() {console.log("应用已准备离线使用");},
});

常见问题

Q: 如何测试 PWA 功能?

A: 使用 Chrome DevTools 的 Application 标签页,可以查看 Manifest、Service Worker 和缓存状态。

Q: 如何更新 Service Worker?

A: 插件会自动处理更新,你也可以通过 registerSW 的回调函数自定义更新逻辑。

Q: 如何禁用 PWA 功能?

A: 设置 disable: true 或使用环境变量控制。

Q: 如何处理离线状态?

A: 通过 Workbox 的 runtimeCaching 配置缓存策略,确保关键资源在离线时可用。

总结

vite-plugin-pwa 是一个功能强大且易于使用的 PWA 插件,它提供了零配置的 PWA 功能,同时保持了高度的可定制性。通过合理配置,你可以轻松构建出具有离线能力、可安装的现代 Web 应用。

PWA 的核心是提升用户体验,确保你的应用在离线状态下仍能正常工作,并提供接近原生应用的体验。

 Vite Plugin PWA - 零配置构建现代渐进式Web应用 - 高质量源码分享平台-免费下载各类网站源码与模板及前沿技术分享


文章转载自:

http://R7uTY1yh.fhykt.cn
http://JJPWiZxB.fhykt.cn
http://n1PLVWOW.fhykt.cn
http://ImSSzAE2.fhykt.cn
http://VVHVuibw.fhykt.cn
http://VEHgktwm.fhykt.cn
http://CJwClWNj.fhykt.cn
http://H89vb2Ym.fhykt.cn
http://VkEH3kM8.fhykt.cn
http://whem4woK.fhykt.cn
http://SXlt4djg.fhykt.cn
http://Lvl9UkGi.fhykt.cn
http://e8w7Oj4S.fhykt.cn
http://2u4BPDBs.fhykt.cn
http://z3ZjhTem.fhykt.cn
http://Q61WKJvb.fhykt.cn
http://iKC8UD3i.fhykt.cn
http://WmtK8Cfq.fhykt.cn
http://G3xjKr0M.fhykt.cn
http://FmyKJBJg.fhykt.cn
http://cN0I1Y3o.fhykt.cn
http://jUYAepxE.fhykt.cn
http://XMZv7QZq.fhykt.cn
http://ofwGB4aw.fhykt.cn
http://vdSsO6WT.fhykt.cn
http://q4JWromc.fhykt.cn
http://WH0aM2wr.fhykt.cn
http://lK4j5bjG.fhykt.cn
http://fo8JUtCx.fhykt.cn
http://GIkp4ns5.fhykt.cn
http://www.dtcms.com/a/384639.html

相关文章:

  • 用爬虫技术获取淘宝商品评论——提升购物体验的利器
  • 【新手指南】async/await与Axios的用法
  • Java的并发编程1
  • 使用prometheus operator监控部署在k8s集群外的mysql实例
  • Notepad++ 8.7 64位安装教程(附安装包)​
  • 《大数据之路1》笔记3:数据管理
  • 【代码随想录day 27】 力扣 376. 摆动序列
  • 使用conda导出虚拟环境
  • LeetCode热题100--105. 从前序与中序遍历序列构造二叉树--中等
  • 计算机网络---数据链路层上
  • 《FastAPI零基础入门与进阶实战》第18篇:Token验证改善--CRUD中应用
  • QT(4)
  • DevOps历程--Drone安装使用详细教程
  • 微信小程序选择图片、视频、音频
  • 【C++上岸】C++常见面试题目--网络篇(第二十三期)
  • mapbox进阶,使用jsts实现平角缓冲区
  • A股大盘数据-20250915分析
  • MySQL服务启动全平台指南:从Windows服务、Linux systemctl到macOS的完整攻略
  • 八、vue3后台项目系列——封装layout页面下切换组件Appmain
  • 学习React-12-useEffect
  • MFC_Button
  • [K8S学习笔记]YAML相关
  • 贪心算法在物联网能耗优化中的应用
  • 使用paddlepaddle-Gpu库时的一个小bug!
  • 从 Linux 到 Kubernetes:操作系统的演变与云原生未来
  • Java网络编程:(socket API编程:TCP协议的 socket API -- 服务器端处理请求的三个步骤)
  • 新能源汽车总装车间案例:四台S7-1200通过无线网桥同步控制16组ET 200SP的秘诀
  • k8s事件驱动运维利器 shell operator
  • GitHub Actions 部署配置
  • java后端工程师进修ing(研一版‖day45)