vite-plugin-pwa 离线安装Vite应用

渐进式Web应用(PWA)通过结合 Web 和移动应用的特点,为用户带来更加流畅和快速的体验。且PWA支持离线访问能力(访问静态资源本地缓存),极大提高了用户交互的流畅性,降低非必要的网络依赖。尤其适合在手机端创建,本文推荐基于Vite的基础上使用vite-plugin-pwa实现A2HS(Add To Home Screen)workbox离线缓存功能。

插件安装

$ npm i vite-plugin-pwa -D

配置

1、添加VitePWA插件

安装完成vite-plugin-pwa插件后,我们只需要在vite.config.ts文件中将其引入就完成基础的pwa配置了。

// vite.config.ts
import { fileURLToPath, URL } from 'node:url'import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
import { VitePWA } from 'vite-plugin-pwa'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue(),vueJsx(),VitePWA({registerType:"autoUpdate",devOptions: {enable: true,}}), // 添加vite-plugin-pwa插件支持],resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))}}
})

我当前安装的vite-plugin-pwa版本为0.18.1,具体支持的插件配置请参考对照版本。其比较重要的支持配置项如下:

  • mode: 开发环境
  • manifest/manifestFilenamepwa对应的应用配置
  • strategies:默认是generateSW然后去配置workbox; 如果想要更多自定义的设置,可以选择injectManifest,那就对应配置injectManifest
  • workbox:给generateSW的配置,配置的所有workbox,将交给workbox-build插件中的generateSW处理,生成最终sw.js中的配置代码
  • registerType:注册类型配置,用于指定 PWA 的注册方式。这里设置为 'autoUpdate',表示自动更新注册方式。

如下是VitePWAOptions 支持的所有配置项:

/*** Plugin options.*/
interface VitePWAOptions {mode?: 'development' | 'production';srcDir?: string; // 默认publicoutDir?: string; // 默认distfilename?: string; // 默认sw.jsmanifestFilename?: string; // 默认 manifest.webmanifeststrategies?: 'generateSW' | 'injectManifest'; // 默认 generateSWscope?: string; // 注册 service worker范围injectRegister: 'inline' | 'script' | 'script-defer' | 'auto' | null | false; // 默认autoregisterType?: 'prompt' | 'autoUpdate'; // 默认 promptminify: boolean; // 默认 truemanifest: Partial<ManifestOptions> | false; // manifest配置对象useCredentials?: boolean; // 是否添加crossorigin="use-credentials"到<link rel="manifest">,默认falseworkbox: Partial<GenerateSWOptions>; // google workbox配置对象,injectManifest: Partial<CustomInjectManifestOptions>;base?: string; // 覆盖vite的base配置,仅仅对于pwaincludeAssets: string | string[] | undefined;includeManifestIcons: boolean;disable: boolean; // 是否在“生成”上禁用service worker注册和生成?默认falseintegration?: PWAIntegration; // Vite PWA集成devOptions?: DevOptions; // 开发环境配置selfDestroying?: boolean; // 是否销毁service worker,默认falsebuildBase?: string; // 构建配置,默认使用vite.config.ts中的配置
}

其支持的

2、添加mainfest配置

manifest用于配置pwa应用的基础信息:如名称、图标、主题色等,也可以选择创建manifest文件来配置应用信息:

  • name : 应用名
  • icons: 应用图标
  • description:应用描述信息
  • short_name: 应用简称
  • theme_color: 样式主题色,默认#42b883
  • background_color:背景色,默认#fff
  • lang:语言,默认en
  • shortcuts:快捷方式的配置信息

import { defineConfig } from 'vite'
...
import { VitePWA } from 'vite-plugin-pwa'// https://vitejs.dev/config/
export default defineConfig({plugins: [
......VitePWA({manifest: {name: 'Vite PWA App',short_name: 'v-pwa',description: '一个Vite PWA测试APP',theme_color: '#fafafa',icons: [{src: '/icons/icon-192x192.png',sizes: '192x192',type:'image/png',},{src: '/icons/icon-512x512.png',sizes: '512x512',type: 'image/png',}],shortcuts: [ // 配置快捷方式,指定打开页面地址{name: "打开首页", // 快捷方式名称short_name: "首页", // 快捷方式简称description: "打开首页", // 快捷方式描述url: "/", // 快捷方式链接地址icons: [{ src: "/favicon.ico", sizes: "36x36" }], // 快捷方式图标配置},]},})],
......
})

3、配置workbox

workbox用于帮助我们处理资源的缓存更新,我们只需要配置一个workbox配置即可按照规则对资源进行本地缓存、以及运行时缓存等操作。

import { defineConfig } from 'vite'
...
import { VitePWA } from 'vite-plugin-pwa'const getCache = ({ name, pattern }: any) => ({urlPattern: pattern,handler: 'CacheFirst' as const,options: {cacheName: name,expiration: {maxEntries: 500,maxAgeSeconds: 60 * 60 * 24 * 365 * 2 // 2 years},cacheableResponse: {statuses: [200]}}
})// https://vitejs.dev/config/
export default defineConfig({plugins: [
......VitePWA({workbox: {globPatterns: ['**/*.{js,css,html,ico,png,jpg,svg}'], //缓存相关静态资源runtimeCaching: [// 配置自定义运行时缓存getCache({pattern: /^https:\/\/enjoytoday.cn\/wp-uploads/, name: 'local-upload'}),getCache({pattern: /^https:\/\/app.enjoytoday.cn/,name: 'webapp'})]}})],
......
})

4、完整配置

如下,给出有关VitePWA插件在vite.config.ts中的完成配置信息。

import { fileURLToPath, URL } from 'node:url'import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
import { VitePWA } from 'vite-plugin-pwa'const getCache = ({ name, pattern }: any) => ({urlPattern: pattern,handler: 'CacheFirst' as const,options: {cacheName: name,expiration: {maxEntries: 500,maxAgeSeconds: 60 * 60 * 24 * 365 * 2 // 2 years},cacheableResponse: {statuses: [200]}}
})// https://vitejs.dev/config/
export default defineConfig({plugins: [vue(),vueJsx(),VitePWA({manifest: {name: 'Vite PWA App',short_name: 'v-pwa',description: '一个Vite PWA测试APP',theme_color: '#fafafa',icons: [{src: '/icons/icon.png',sizes: '192x192',type: 'image/png'},{src: '/icons/icon.png',sizes: '512x512',type: 'image/png'}],shortcuts: [{name: '打开首页', // 快捷方式名称short_name: '首页', // 快捷方式简称description: '打开首页', // 快捷方式描述url: '/', // 快捷方式链接地址icons: [{ src: '/favicon.ico', sizes: '36x36' }] // 快捷方式图标配置}]},registerType: "autoUpdate", // 注册类型配置devOptions: {enabled: true, // 开发选项配置,启用插件},workbox: {globPatterns: ['**/*.{js,css,html,ico,png,jpg,svg}'], //缓存相关静态资源runtimeCaching: [// 配置自定义运行时缓存getCache({pattern: /^https:\/\/enjoytoday.cn\/wp-uploads/, name: 'local-upload'}),getCache({pattern: /^https:\/\/app.enjoytoday.cn/,name: 'webapp'})]}})],resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))}}
})

应用安装

通过上述配置我们添加了一个离线引用,当浏览器支持A2HS的情况下,我们可以通过代码对其进行一个安装并添加桌面上,以便于我们能过快速抵达应用。如下介绍如何安装应用。

1、配置应用安装触发

希望安装应用到桌面需要我们预先配置应用安装触发,首先需要在入口处添加监听,然后通过我们的交互方式进行应用的安装操作(或者通过工具栏的图标主动安装)。

// 在主入口监听PWA注册事件,如main.ts
window.addEventListener('beforeinstallprompt', (e) => {e.preventDefault()window.deferredPrompt = e
})// 在具体页面添加安装,如App.vue
<script setup lang="ts">
import { RouterLink, RouterView } from 'vue-router'
import HelloWorld from './components/HelloWorld.vue'// 若浏览器支持,则这里会出发安装操作
const openAddFlow = () => {try {window.deferredPrompt.prompt()window.deferredPrompt.userChoice.then((choiceResult) => {if (choiceResult.outcome === 'accepted') {// showAddToDesktop.value = falselocalStorage.setItem('addDesktop', true)} else {console.log('User dismissed the A2HS prompt')}window.deferredPrompt = null})} catch {//}
}
</script><template><header><img alt="Vue logo" class="logo" src="@/assets/logo.svg" width="125" height="125"  @click="openAddFlow"/><div class="wrapper"><HelloWorld msg="You did it!"  /><nav><RouterLink to="/">Home</RouterLink><RouterLink to="/about">About</RouterLink></nav></div></header><RouterView />
</template>

2、应用安装

3、缓存

我并未将其部署线上地址,也没有添加配置的运行时请求数据,所以这里不会展示配置的运行时缓存信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/853709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

卡尔曼滤波源码注释和调用示例

卡尔曼滤波源码注释和调用示例 flyfish Python版本代码地址 C版代码地址 主要用于分析代码&#xff0c;增加了中文注释 import numpy as np import scipy.linalg""" 0.95分位数的卡方分布表&#xff0c;N自由度&#xff08;包含N1到9的值&#xff09;。 取自…

【JS重点15】原型对象概述

目录 一&#xff1a;构造函数缺陷 二&#xff1a;原型 1 原型是是什么 2 原型对象的作用 3 原型对象this指向问题 4 利用原型对象添加方法 给JS内置构造函数Array添加最大值方法 给JS内置构造函数Array添加求和方法 三&#xff1a;Constructor属性 四&#xff1a;如何…

情绪管理:大我则定,小我则乱(王阳明)

学了很多知识&#xff0c;却还是感物易动&#xff1f;如何让心回归中正&#xff1f;王阳明一言以蔽之&#xff1a; —— 大我&#xff0c;大我则定&#xff0c;小我则乱 保持心静的方法&#xff1a;有大爱&#xff0c;为大局着想

全球“抱团”美股,美股“抱团”AI

内容提要 过去一个月内&#xff0c;全球约有300亿美元新资金流入股票基金&#xff0c;其中高达94%投向了美国资产&#xff1b;一季度&#xff0c;海外投资者购入了1870亿美元美国公司债券&#xff0c;同比增长61%。 文章正文 尽管美国面临债务问题和大选带来的政治分歧&#…

单链表——AcWing.826单链表

单链表 定义 单链表是一种常见的数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含一个数据元素和一个指向下一个节点的指针。 运用情况 用于实现动态的数据存储和管理&#xff0c;例如实现栈、队列等其他数据结构。在需要频繁进行插入和删除操作时非常有用…

pdf文件怎么改变大小?在线快速压缩pdf的方法

pdf作为一种常用的文件格式&#xff0c;使用这种文件类型的好处在于不仅拥有更好的兼容性&#xff0c;还可以设置密码来保证安全性&#xff0c;防止未授权用户查看内容&#xff0c;所以现在导出文件展示都会采用这种格式的来做内容展示。当遇到pdf文件过大问题时&#xff0c;想…

Python虚拟环境的配置

前言&#xff1a; 本人一度被Python的虚拟环境的配置所困扰&#xff0c;前段时间抽空学习了一下&#xff0c;现在总结一下方法&#xff0c;供大家参考。 先使用winr打开命令行窗口。 展示所有虚拟环境 conda env list 创建虚拟环境 例如我们创建一个叫做py_sk的虚拟环境 …

MSPM0L1306快速创建可移动工程(一)

设置成文本文件 宏定义 __MSPM0L1306__

大型企业IT基础架构和应用运维体系

大型企业IT基础架构和应用运维体系 在数字化转型的浪潮中&#xff0c;大型企业面临着日益复杂的IT环境。高效的IT基础架构和应用运维体系&#xff0c;是确保企业业务连续性和竞争力的关键。本文将探讨大型企业如何构建强健的IT基础架构&#xff0c;并建立高效的应用运维体系&a…

Codeforces Global Round 26 A~E

A.Strange Splitting&#xff08;思维&#xff09; 题意&#xff1a; 将非空数组的范围定义为最大值减去最小值。例如&#xff0c; [ 1 , 4 , 2 ] [1,4,2] [1,4,2]的范围是 4 − 1 3 4-13 4−13。 给你一个长度为 n ≥ 3 n\geq 3 n≥3的数组 a 1 , a 2 , … , a n a_1,a_2,…

SpringBoot整合H2数据库并将其打包成jar包、转换成exe文件二(补充)

SpringBoot整合H2数据库并将其打包成jar包、转换成exe文件二&#xff08;补充&#xff09; 如果你想在cmd命令窗口内看到程序运行&#xff0c;即点开弹出运行窗口&#xff0c;关闭时exe自动关闭。 需要再launch4j上进行如下操作&#xff1a; 这样转换好的exe就可以有控制台了…

卡尔曼滤波原理及应用(一)

一.状态空间方程 系统的状态空间方程描述了系统的动态行为和状态演化过程。它由两个方程组成&#xff1a;状态方程和观测方程。系统的状态空间表达式简写为&#xff1a; 变量描述如下&#xff1a; x(t) 是系统的状态向量&#xff0c;表示系统在时间 &#x1d461;的状态。&…

【2024亲测无坑】Oracle--19C在Centos7上的静默安装(rpm版)

一、Oracle 19c Linux安装&#xff08;Centos 7&#xff09; 1.查看磁盘可用空间及配置ip地址 [rootlocalhost /]# df -h 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 1.4G 0 1.4G 0% /dev tmpfs 1.4G …

程序猿大战Python——函数——拆包和交换变量值与引用

拆包 目标&#xff1a;了解拆包的使用。 先来看看在现实生活中的拆包。比如&#xff0c;张同学背着背包来教室上课后&#xff0c;需要从背包中拿出电脑、鼠标、数据线、电源线等&#xff0c;这个过程就是拆包! 接着&#xff0c;看一下在Python程序中的拆包&#xff1a;把组合形…

阅读笔记:明朝那些事儿太监弄乱的王朝

阅读豆评高分作品《明朝那些事儿太监弄乱的王朝》第三部&#xff0c;截止到今天告一段落了&#xff0c;前两部皇帝&#xff0c;太子相对比较少&#xff0c;了解故事的主线&#xff0c;分支不算多&#xff0c;记忆起来还能应付过来&#xff0c;第三部皇帝&#xff0c;太子更换的…

R语言数据分析案例29-基于ARIMA模型的武汉市房价趋势与预测研究

一、选题背景 房地产行业对于国民经济和社会及居民的发展和生活具有很大的影响&#xff0c;而房价能够体现经济运转的好坏&#xff0c;因而房价的波动牵动着开发商和购房者的关注&#xff0c;城市房价预测是一个研究的热点问题&#xff0c;研究房价对民生问题具有重要意义。 …

拍抖音素材段子去哪里找?哪里有搞笑段子文案以及视频素材?

拍抖音视频非常火爆&#xff0c;很多人都在为找素材发愁。别担心&#xff0c;今天我给大家推荐几个非常不错的网站&#xff0c;保证你们找到满满的灵感&#xff0c;拍出更有趣的段子视频&#xff01; 蛙学府 首先要推荐的是蛙学府。这个网站不仅素材多&#xff0c;还提供各种段…

监控室,屏幕显示不支持码流

1号屏&#xff0c;出现不支持码流 如下原因 老是录像机 无法关闭自动添加摄像头功能&#xff0c; 其他杂牌摄像头 会自动还ip 最终导致 ip冲突 更换ip 可以解决

Base64编码的工作原理与实际应用

目录 前言 一、什么是Base64编码&#xff1f; 二、Base64编码的原理 三、Base64编码的应用场景 四、为什么要使用Base 64 五、Base64加密解密的实现 前言 当你需要将二进制数据转换为可传输和存储的文本格式时&#xff0c;Base64编码是一个常用的选择。在这篇博客中&#…

Qwen2大语言模型微调、导出、部署实践

上篇文章&#xff1a; Qwen1.5大语言模型微调实践_qwen1.5 7b微调-CSDN博客 我们介绍了Qwen1.5 大语言模型使用LLaMA-Factory 来微调&#xff0c;这篇文章我们介绍一下微调后模型的导出、部署。 一、模型导出 在webui 界面训练好模型之后点击“Export”选项卡&#xff0c;然…