记录-vue项目中使用PWA
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
前言:
梳理了一下项目中的PWA的相关用法,下面我会正对vue2和vue3的用法进行一些教程示例,引入离线缓存机制,即使你断网,也能访问页面。一旦用户访问了我们的网页,我们就像牛皮糖一样粘连着他,他永远都可以访问,即使断网也能访问。有一天我们下掉了网站他仍然能够访问,这就是把缓存写入了cache storage,并安装注册到用户的本地。
PAW在vue-admin-element下的相关配置
1、执行vue add @vue/cli-plugin-pwa
package.json里会增加两个依赖 // dependencies下
"register-service-worker"
<!-- devDependencies下 -->
"@vue/cli-plugin-pwa" 会自动在src的根目录生成一个registerServiceWorker.js文件
2、在main.js导入
import './registerServiceWorker'
3、在src下新建service-worker.js文件
完整配置如下(拿来即用)
/* eslint-disable no-undef*/
importScripts('https://storage.googleapis.com/workbox-cdn/releases/5.1.2/workbox-sw.js')
if (workbox) {
console.log(`Yay! Workbox is loaded `)
} else {
console.log(`Boo! Workbox didn't load `)
} workbox.core.setCacheNameDetails({
prefix: 'ochase-search',
suffix: 'v1.0.0'
})
workbox.core.skipWaiting() // 强制等待中的 Service Worker 被激活
workbox.core.clientsClaim() // Service Worker 被激活后使其立即获得页面控制权
workbox.precaching.precacheAndRoute(self.__precacheManifest || []) // 设置预加载 // 缓存web的css资源
workbox.routing.registerRoute(
// Cache CSS files
/.*\.css/,
// 使用缓存,但尽快在后台更新
new workbox.strategies.StaleWhileRevalidate({
// 使用自定义缓存名称
cacheName: 'css-cache'
})
) // 缓存web的js资源
workbox.routing.registerRoute(
// 缓存JS文件
/.*\.js/,
// 使用缓存,但尽快在后台更新
new workbox.strategies.StaleWhileRevalidate({
// 使用自定义缓存名称
cacheName: 'js-cache'
})
) // 缓存web的图片资源
workbox.routing.registerRoute(
/\.(?:png|gif|jpg|jpeg|svg)$/,
new workbox.strategies.StaleWhileRevalidate({
cacheName: 'images',
plugins: [
new workbox.expiration.ExpirationPlugin({
maxEntries: 60,
maxAgeSeconds: 30 * 24 * 60 * 60 // 设置缓存有效期为30天
})
]
})
) // 如果有资源在其他域名上,比如cdn、oss等,这里做单独处理,需要支持跨域
workbox.routing.registerRoute(
/^https:\/\/cdn\.ochase\.com\/.*\.(jpe?g|png|gif|svg)/,
new workbox.strategies.StaleWhileRevalidate({
cacheName: 'cdn-images',
plugins: [
new workbox.expiration.ExpirationPlugin({
maxEntries: 60,
maxAgeSeconds: 5 * 24 * 60 * 60 // 设置缓存有效期为5天
})
],
fetchOptions: {
credentials: 'include' // 支持跨域
}
})
)
4、改造registerServiceWorker.js
需要先判断浏览器是否支持serviceWorker否则部署后控制台会报错;然后需要改造register引入的位置,默认是走环境变量,为了更方便我用了获取当前地址去根目录下找到service-worker.js,完整改造后的代码如下(拿来即用)
/* eslint-disable no-console */
import { register } from 'register-service-worker'
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
if (process.env.NODE_ENV === 'production') {
register(`${window.location.origin}/service-worker.js`, {
ready() {
console.log(
'App is being served from cache by a service worker.\n' +
'For more details, visit https://goo.gl/AFskqB'
)
},
registered() {
console.log('Service worker has been registered.')
},
cached() {
console.log('Content has been cached for offline use.')
},
updatefound() {
console.log('New content is downloading.')
},
updated() {
console.log('New content is available; please refresh.')
},
offline() {
console.log('No internet connection found. App is running in offline mode.')
},
error(error) {
console.error('Error during service worker registration:', error)
}
})
}
})
}
5、配置vue.config.js
在module.exports下配置pwa的配置项如下
module.exports = {
pwa: {
name: 'xxx',
themeColor: '#4DBA87',
msTileColor: '#000000',
appleMobileWebAppCapable: 'yes',
appleMobileWebAppStatusBarStyle: 'black',
workboxPluginMode: 'InjectManifest',
workboxOptions: {
importScripts: ['https://storage.googleapis.com/workbox-cdn/releases/5.1.4/workbox-sw.js'],
exclude: [/\.html$/],//html不进行service Worker缓存
// 自定义 Service Worker 文件的位置
swSrc: 'src/service-worker.js'
}
},
//...otherCode
}
如何到这一步基本上就配置好了,这里我们需要注意一下 *注意️️️PWA是基于Service Worker,由于Service Worker权限很高,所以只支持https协议或者localhost️️️ 本地运行项目后在localhost下可以看到这个图标,
点击安装,就安装在了电脑本地了,也可以在chrome地址栏输入
chrome://apps/ 查看管理安装的webapp(pwa)
6、配合nginx进行协商缓存
可以打包发布到nginx上,配合协商缓存(因为我们即需要缓存,也需要在代码更新后拉取缓存最新的代码),所以需要对html文件进行专项协商缓存,nginx配置如下
#在server下配置
location / {
if ($request_filename ~* .*\.(?:htm|html)$) {
add_header Cache-Control "no-cache";
}
root /usr/local/h5/demo;
index index.html;
try_files $uri $uri/ /index.html;
}
7、打包发布到nginx服务器下就可以进行访问查看了
再次提醒注意*注意️️️PWA是基于Service Worker,由于Service Worker权限很高,所以只支持https协议或者localhost️️️所以线上的域名一定要是https协议才行;可以在控制台查看请求相关的缓存状态
再次刷新后就可以看到直接从serviceWorker里面读取里
也可以在Application里查看serviceWorker的状态
至此就可以运行了,但是缓存的逻辑有很多种,可以根据自己的实际需求来进行离线缓存,弱网缓存,PWA的强大不止于此,后面我会继续深入出一个深入一点的文章
注意中间可能出现问题:
先检查是否符合️️️PWA是基于Service Worker,由于Service Worker权限很高,所以只支持https协议或者localhost️️️**
在线上进行网站访问的时候控制台可能会报错,当报错从service-worker.js出来的时候需要注意配置是否和我的一致,我之前按照网上的其他教程配置会出问题
import { precacheAndRoute } from 'workbox-precaching'
precacheAndRoute(self.__WB_MANIFEST)
此处是网上教程会报错,导入方式在我自己项目里部署后访问serviceworker会报错,导入方式不支持,所以可以改成我上面配置的示例用importScripts来导入;
- 包括排除html的缓存
exclude: [/.html$/],//html不进行service Worker缓存,因为我们要让更新后的代码及时生效,所以进行协商缓存。
本文转载于:
https://juejin.cn/post/7221057111090495547
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

记录-vue项目中使用PWA的更多相关文章
- 在vue项目中的axios使用配置记录
默认vue项目中已经安装axios,基于element-ui开发,主要记录配置的相关. axiosConfig.js import Vue from 'vue' import axios from ' ...
- vue项目中遇到的一些问题
或访问:https://github.com/littleHiuman/experiences-about-vue 欢迎补充! vuex 状态 vue-cli 命令行 vue vue vue-rou ...
- Vue项目中遇到的一些问题总结
一.开发环境使用Ajax请求,报错 网上查的资料,在config中的index.js这样设置 proxyTable:{ '/api':{ target:'', //此处为你的API接口地址 chan ...
- 如何在VUE项目中使用SCSS
首先要了解什么是CSS 预处理器? SCSS是一种CSS预处理语言 定义了一种新的专门的编程语言,编译后形成正常的css文件,为css增加一些编程特性,无需考虑浏览器的兼容性(完全兼容css3),让c ...
- 在vue项目中如何添加eslint
随着vue的越做越好,更多的开发者选择使用vue,本篇记录如何在vue项目中添加eslint. 首先第一种就是在vue项目创建初始时就选择了创建,随着初始化一起代入到了项目当中,那么要是一开始觉得es ...
- vue项目中使用bpmn-自定义platter
前情提要 经过前四篇的学习,我们能够实现bpmn基本绘图.预览.为节点加事件加颜色等效果,这一篇我们来说,如何自定义左侧工具栏(platter),首先看一下自定义前后效果图对比: 我们本次要实现的目标 ...
- vue项目中使用ts(typescript)入门教程
最近项目需要将原vue项目结合ts的使用进行改造,这个后面应该是中大型项目的发展趋势,看到一篇不错的入门教程,结合它并进行了一点拓展记录之.本文从安装到vue组件编写进行了说明,适合入门. 1.引入T ...
- 更换vue项目中标签页icon
问题:在vue项目中, 需要将标签上的icon换成自己所需的,发现在更换了public/favicon.ico后,没有生效,依旧是原来Vue的icon. 解决办法:在vue.config.js中,修改 ...
- vue 项目中实用的小技巧
# 在Vue 项目中引入Bootstrap 有时在vue项目中会根据需求引入Bootstrap,而Bootstrap又是依赖于jQuery的,在使用npm按照时,可能会出现一系列的错误 1.安装jQu ...
- 如何在VUE项目中添加ESLint
如何在VUE项目中添加ESLint 1. 首先在项目的根目录下 新建 .eslintrc.js文件,其配置规则可以如下:(自己小整理了一份),所有的代码如下: // https://eslint.or ...
随机推荐
- NEMU PA 3-2 实验报告
一.实验目的 在上一章节我们完成了Cache的实现,但是这只是在速度上提高了取指和存取操作数的效率,而在访问的安全性上没有得到有效提升. 在PA3-2中我们要完成的,就是在NEMU中实现分段机制. 二 ...
- NC24605 [USACO 2011 Ope S]Corn Maze
题目链接 题目 题目描述 This past fall, Farmer John took the cows to visit a corn maze. But this wasn't just an ...
- Java 封装、继承、多态的理解
更好的阅读体验:Java 封装.继承.多态的理解 1.封装 封装:就是隐藏对象的属性和实现细节,仅对外提供公共访问方式.让使用者知道的才暴露出来,不需要让使用者知道的全部隐藏起来 封装的好处:避免使用 ...
- STC8A8K64S4A12内部时钟的IRTRIM和LIRTRIM简单标定
STC8A8K64S4A12因为没有固化的频率调节值, 要么在STC-ISP烧录时设置写入, 要么通过idata高地址读取, 这对于Linux下的SDCC用户就非常不方便, 既不能用STC-ISP, ...
- OneCloud记录
配置信息 S805, 1G RAM, 8G ROM, USB2.0 * 2, 1GB LAN, SD Cardreader S805参数: 32-bit, ARMv7-A, Cortex-A5, 1. ...
- LayUI样式优化
如下是LayUI框架中页面元素的CSS优化样式: /* 表单输入框宽度 */ .layui-form-item .layui-input-inline { width: 295px; } /* 下拉框 ...
- 这样优化,0.059s 启动一个SpringBoot项目
https://mp.weixin.qq.com/s/2_tQO7Z6GfmC6y73jc6ITQ
- 关于json序列化时报错json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
1.今天在写客户端与服务端交互的程序的时候,发现了一个问题 客户端代码 #客户端程序主要是发送注册请求/登录请求给服务端,服务端接收响应后回应对应的应答给客户端,客户端接收响应后,然后做一些操作 # ...
- 06-Redis系列之-哨兵(Redis-Sentinel)和集群详解和搭建
主从架构高可用 主从架构存在的问题 主从复制,主节点发生故障,需要做故障转移.(可以手动转移:让其中一个slave变成master) 主从复制,只有主写数据,所以写能力和存储能力有限 总结:redis ...
- 【LeetCode二叉树#01】二叉树的遍历(递归/迭代)
二叉树递归遍历 写递归算法时候需要遵循的三个点: 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函 ...
