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

news/2024/7/10 1:23:54 标签: vite-plua-pwa, vue

工作业务需求,需要给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.niftyadmin.cn/n/4927341.html

相关文章

Facebook商城号最全解析,Facebook Marketplace运营技巧

相信许多做跨境的小伙伴都听说过Facebook商城号。其实所谓的商城并不是Facebook Shop,而是指Facebook Marketplace,它不像前者需要各类入驻条件,只要拥有facebook账号而且所在地区有能够使用marketplace就可以在上面进行商品售卖。这种低成本…

JavaScript的三大组成部分是什么?JavaScript的核心组成部分解析:语法、BOM和DOM

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

0基础学C#笔记08:插入排序法

文章目录 前言一、过程简单描述:二、代码总结前言 我们在玩打牌的时候,你是怎么整理那些牌的呢?一种简单的方法就是一张一张的来,将每一张牌插入到其他已经有序的牌中的适当位置。当我们给无序数组做排序的时候,为了要插入元素,我们需要腾出空间,将其余所有元素在插入之…

福田区地铁站点数据

做实验缺少地铁站点数据,在tb买了一份,处理的过程中发现了一些问题。 站点重复,同一个站点,有两条甚至多条记录 对于同一个站点,哪怕你是不同的线路,仍然只保留一个,先用福田行政区进行裁剪&…

Vue+Vue Router+TailwindCss+Daisyui部署

一、构建Vue项目 > npm init vuelatest > cd <your-project-name> > npm install > npm run dev 二、设置IDEA JS版本 三、安装Tailwindcss Install Tailwind CSS with Vite - Tailwind CSS npm install -D tailwindcss postcss autoprefixer npx tai…

输入框限制输入内容——只能输入数字和小数点

以vue的input为例&#xff0c;需求只能输入数字和小数点 <el-input input"money money.replace(/[^\d|\.]/g, )" v-model"money" /> 原理&#xff1a;通过绑定输入事件 使用replace字符串替换方法修改绑定的值 money就是自己绑定的值 /[^\d|\.]/…

java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver的解决办法

springcloudAlibaba项目连接mysql时&#xff08;mysql版本8.0.31&#xff0c;Springboot2.2.2,spring cloud Hoxton.SR1,spring cloud alibaba 2.1.0.RELEASE&#xff09;&#xff0c;驱动名称报红&#xff0c;配置如下&#xff1a; 原因&#xff1a;引入的jdbc驱动包和使用的m…

积累常见的有针对性的python面试题---python面试题001

1.考点列表的.remove方法的参数是传入的对应的元素的值,而不是下标 然后再看remove这里,注意这个是,删除写的那个值,比如这里写3,就是删除3, 而不是下标. remove不是下标删除,而是内容删除. 2.元组操作,元组不支持修改,某个下标的内容 可以问他如何修改元组的某个元素 3.…