Vue3引用PWA,vite-plugin-pwa的使用及注意要点

news2024/11/28 6:54:28

工作业务需求,需要给H5页面增加PWA功能,主要是需要有一键添加到桌面,而不是指引用户在浏览器工具栏操作。

查找了一些资料,主要是用到 Add to Home Screen,简称 A2HS,需要主要的是此方法只有部分浏览器支持,Mobile Chrome / Android Webview 从 31 版开始支持 A2HS,Opera for Android 从 32 版开始支持,Firefox for Android 从 58 版 (en-US) 开始支持。

Vue3+vite有个好用的插件 vite-plugin-pwa,只需要在vite.config.js做配置即可。

npm i vite-plugin-pwa -D 

// vite.config.js / vite.config.ts
import { VitePWA } from 'vite-plugin-pwa'

export default {
  plugins: [
    VitePWA({
    	manifest: {
          name: 'PWA应用',
          short_name: 'PWA',
          description: 'PWA应用测试',
          theme_color: '#182330',
          icons: [		//添加图标, 注意路径和图像像素正确
            {
              src: '/img/icon/icon_192.png',
              sizes: '192x192',
              type: 'image/png',
            },
            
          ]
        },
        registerType: 'autoUpdate',
        workbox: {
          globPatterns: ['**/*.{js,css,html,ico,png,jpg,svg}'],		//缓存相关静态资源
          runtimeCaching: [                                                     // 配置自定义运行时缓存
		        mode !== 'production'
		          ? {
		              urlPattern: ({ url }) => url.origin === 'https://app-api-0.com',
		              handler: 'NetworkFirst',
		              options: {
		                cacheName: 'wisbayar-api',
		                cacheableResponse: {
		                  statuses: [200]
		                }
		              }
		            }
		          : {
		              urlPattern: ({ url }) => url.origin === 'https://app-api.id',
		              handler: 'NetworkFirst',
		              options: {
		                cacheName: 'wisbayar-api',
		                cacheableResponse: {
		                  statuses: [200]
		                }
		              }
		            },
		        {
		          urlPattern: /\.(?:png|jpg|jpeg|svg)$/,
		          handler: 'CacheFirst',
		          options: {
		            cacheName: 'wisbayar-images',
		            expiration: {
		              // 最多30个图
		              maxEntries: 30
		            }
		          }
		        },
		        {
		          urlPattern: /.*\.js.*/,
		          handler: 'StaleWhileRevalidate',
		          options: {
		            cacheName: 'wisbayar-js',
		            expiration: {
		              maxEntries: 30, // 最多缓存30个,超过的按照LRU原则删除
		              maxAgeSeconds: 30 * 24 * 60 * 60
		            },
		            cacheableResponse: {
		              statuses: [200]
		            }
		          }
		        },
		        {
		          urlPattern: /.*\.css.*/,
		          handler: 'StaleWhileRevalidate',
		          options: {
		            cacheName: 'wisbayar-css',
		            expiration: {
		              maxEntries: 20,
		              maxAgeSeconds: 30 * 24 * 60 * 60
		            },
		            cacheableResponse: {
		              statuses: [200]
		            }
		          }
		        },
		        {
		          urlPattern: /.*\.html.*/,
		          handler: 'StaleWhileRevalidate',
		          options: {
		            cacheName: 'wisbayar-html',
		            expiration: {
		              maxEntries: 20,
		              maxAgeSeconds: 30 * 24 * 60 * 60
		            },
		            cacheableResponse: {
		              statuses: [200]
		            }
		          }
		        }
		      ]
        },
        devOptions: {
          enabled: true
        }
	})
  ]
}
/ main.js

// 在主入口监听PWA注册事件
window.addEventListener('beforeinstallprompt', (e) => {
    e.preventDefault();
    window.deferredPrompt = e;
})

/ App.vue (实际业务页面)
const openAddFlow = () => {
        if (isIOS()) {
        	// 如果是苹果手机,直接显示浏览器设置指引图
            showAddTipsDialog.value = true
        } else {
            try {
                window.deferredPrompt.prompt();
                window.deferredPrompt.userChoice.then((choiceResult) => {
                    if (choiceResult.outcome === 'accepted') {
                        // showAddToDesktop.value = false
                        localStorage.setItem('addDesktop',true)
                    } else {
                        console.log('User dismissed the A2HS prompt');
                    }
                    window.deferredPrompt = null;
                });
            } catch {
                showAddTipsDialog.value = true
            }
        }
 }

点击图片悬浮窗

弹出下载提示

实际效果如上图,点击业务页面的悬浮窗口,如果是支持 A2HS 的浏览器会弹出下载提示,点击安装会自动安装H5应用。

开发过程序遇到一些注意的点和坑,这里记录一下,以免其他小伙伴重复尝试

1. vite.config.js里配置icons注意

icons 不能将size设置的太小,我一开始设置成 64x64,会报如下错误,至少是要144及以上的大小才行,另外如果icon设置大小与实际大小不匹配,也会报错。

在这里插入图片描述

2. 增加监听事件的时机

window.addEventListener('beforeinstallprompt', (e) => {
    e.preventDefault();
    window.deferredPrompt = e;
})

以上代码的执行时机很重要,最开始我都是放在App.vue的onMounted下执行,发现有时成功有时失败,放到main.js下面执行就每次都能成功,应是在要sw.js执行之前注册完事件才行,所以监听事件执行越早越好。

3. PWA只能在本地和带有https证书的域名下运行

如果是区域网192.168.0.xx下,你会发现报错 Page is not served form a secure origin
所以测试时只能在 http://localhost:8000/ 这种本地域名测试,手机要测试只能放到带https的测试域名才行
在这里插入图片描述

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

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

相关文章

.netcore grpc客户端流方法详解

一、客户端流式处理概述 客户端流式处理方法在该方法没有接收消息的情况下启动。 requestStream 参数用于从客户端读取消息。 返回响应消息时,客户端流式处理调用完成。客户端可以发送多个消息流到服务端,当所有客户端消息流发送结束,调用请…

Mac 调试 ios safar

1. 打开Mac的 Safari 浏览器的“开发”菜单 运行 Safari 浏览器,然后依次选取“Safari 浏览器”>“偏好设置”,点按“高级”面板,然后勾选“在菜单栏中显示开发菜单”。 2. 开启IPhone的Safari调试模式 启用 Web 检查 功能,打…

『PostgreSQL』在 PostgreSQL中创建只读权限和读写权限的账号

📣读完这篇文章里你能收获到 理解在 PostgreSQL 数据库中创建账号的重要性以及如何进行账号管理掌握在 PostgreSQL 中创建具有只读权限和读写权限的账号的步骤和方法学会使用 SQL 命令来创建账号、为账号分配适当的权限以及控制账号对数据库的访问级别了解如何确保…

OR36 链表的回文结构 题解

题目描述:链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。 给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结…

QT开发环境下的一些运行框架概述

QT运行框架与MFC的不同,两者结合会学习得更快! 送给那些刚入门QT的学生们!这里是小白学程序开发,欢迎加入我们跟我一起学习,一起成长! 区别一:入口函数 首先执行的是主对话框函数中的构造函数…

Oracle database Linux自建环境备份至远端服务器自定义保留天数

环境准备 linux下安装oracle 请看 oracle12c单节点部署 系统版本: CentOS 7 软件版本: Oracle12c 备份策略与实现方法 此次备份依赖Oracle自带命令exp与linux下crontab命令(定时任务) exp Oracle中exp命令是一个用于导出数据库数据和对象的…

【Java】常用Stream API

常见 Stream 流表达式 总体结构图 一、两大类型 中间操作(Intermediate Operations) 中间操作是指在Stream上执行的操作, 它们返回一个新的Stream, 允许你链式地进行多个中间操作. 终端操作(Terminal Operations) 对Stream进行最终处理的操作, 当调用终端操作时, Stream会开始执…

老师如何制作学生分班信息查询系统?

即将迎来新学期的开始!学校和老师们将忙于为我们可爱的学生做分班准备。如果有一个强大的分班查询系统,学生们就可以提前知道自己被分到哪个班级,有哪些课程,以及班主任是谁! 别担心,我将教你如何设计一个…

前端开发常见效果

目录 css实现图像填充文字 css实现手风琴效果 css实现网站变灰色 elementUi的导航栏效果 css实现滚动吸附效果 鼠标经过&#xff0c;元素内部放大 css实现图像填充文字 效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><meta c…

带你彻底了解什么是API接口?

作为一名资深程序员&#xff0c;我知道很多人对API接口这个名词可能还不太了解。今天我要给大家分享一些关于API接口的知识&#xff0c;让你们彻底了解它的概念和作用。一起来看看吧&#xff01; 首先&#xff0c;我们先来解释一下API的全称─Application Programming Interfac…

FPGA应用学习-----FIFO双口ram解决时钟域+asic样机的时钟选通

60m写入异步ram&#xff0c;再用100M从ram中读出 写地址转换为格雷码后&#xff0c;打两拍和读地址判断是否空产生。相反读地址来判断是否满产生。 分割同步模块 asic时钟的门控时钟&#xff0c;fpga是不推荐采用门控时钟的&#xff0c;有很多方法移除fpga的时钟选通。 如果是a…

0基础学C#笔记10:归并排序法

文章目录 前言一、递归的方式二、代码总结前言 将一个大的无序数组有序,我们可以把大的数组分成两个,然后对这两个数组分别进行排序,之后在把这两个数组合并成一个有序的数组。由于两个小的数组都是有序的,所以在合并的时候是很快的。 一、递归的方式 通过递归的方式将大…

研发效能行业工具书来袭!12位专家推荐,文末包邮免费送!

近年来&#xff0c;研发效能度量是一个热点话题。在行业里几乎每家公司的高层都在关注如何有效度量研发效能&#xff0c;合理提升效率、项目质量&#xff0c;降低成本。 尽管这些公司来自互联网、金融、房地产、汽车行业等各行各业&#xff0c;且业务不同、软件研发模式不同&a…

誉天HCIA-CloudService3.0 课程简介

课时数&#xff1a;30 课时 一、云计算概念和价值 1.1 什么是云计算 1.1.1 IT 发展历程及面临的挑战 1.1.2 云计算的定义 1.1.3 云计算的应用场景 1.1.4 云计算技术 1.1.4.1 虚拟化 1.1.4.2 云计算 1.1.4.3 容器 1. 2. 云计算部署形态及商业模式 1.2.1 IaaS 1.2.2 PaaS 1.2.3 S…

BM8 链表中倒数最后k个结点

/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param pHead ListNode类 …

Blender如何给fbx模型添加材质贴图并导出带有材质贴图的模型

推荐&#xff1a;使用 NSDT场景编辑器快速助你搭建可二次编辑的3D应用场景 此教程适合新手用户&#xff0c;专业人士直接可直接绕路。 本教程中介绍了利用Blender建模软件&#xff0c;只需要简单几步就可以为模型添加材质贴&#xff0c;图&#xff0c;并且导出带有材质的模型文…

php代码审计,php漏洞详解

文章目录 1、输入验证和输出显示2、命令注入(Command Injection)3、eval 注入(Eval Injection)4、跨网站脚本攻击(Cross Site Scripting, XSS)5、SQL 注入攻击(SQL injection)6、跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)7、Session 会话劫持(Session Hijacking…

PC端自动化工具pywinauto:如何选择应用程序的窗口?

如何选择需要打开的应用程序的窗口有2种方法&#xff1a; ①通过窗口标题/窗口类名来打开应用程序窗口&#xff0c;第一步就要打开窗口精灵&#xff0c;通过拖动放大镜到应用窗口找到窗口标题和窗口类名&#xff0c;如下图所示&#xff1a; 接下来就可以根据窗口类名和标题选择…

PostgreSQL技术沙龙|PPT合集速来下载

新机遇&#xff0c;新态势&#xff0c;新发展 2023年8月5日&#xff0c;由中国开源软件推进联盟PG分会&#xff08;中国PG分会&#xff09;联合杭州云贝教育共同举办的“PostgreSQL技术沙龙杭州站”圆满举行。本次活动结合当下去O、国产化趋势&#xff0c;邀请社群技术专家围…

LoadRunner 脚本优化之——参数化迭代介绍

在LoadRunner的脚本优化时&#xff0c;有时发送给服务器的请求参数化时&#xff0c;服务器返回的内容也会和参数化的内容相对应&#xff0c;例如发送的请求带有查询key123&#xff0c;则服务器也会返回含有123相关的内容。这时我们在使用检查点检查服务器参数化返回的数据正确性…