这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

前言:

梳理了一下项目中的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的更多相关文章

  1. 在vue项目中的axios使用配置记录

    默认vue项目中已经安装axios,基于element-ui开发,主要记录配置的相关. axiosConfig.js import Vue from 'vue' import axios from ' ...

  2. vue项目中遇到的一些问题

    或访问:https://github.com/littleHiuman/experiences-about-vue  欢迎补充! vuex 状态 vue-cli 命令行 vue vue vue-rou ...

  3. Vue项目中遇到的一些问题总结

    一.开发环境使用Ajax请求,报错  网上查的资料,在config中的index.js这样设置 proxyTable:{ '/api':{ target:'', //此处为你的API接口地址 chan ...

  4. 如何在VUE项目中使用SCSS

    首先要了解什么是CSS 预处理器? SCSS是一种CSS预处理语言 定义了一种新的专门的编程语言,编译后形成正常的css文件,为css增加一些编程特性,无需考虑浏览器的兼容性(完全兼容css3),让c ...

  5. 在vue项目中如何添加eslint

    随着vue的越做越好,更多的开发者选择使用vue,本篇记录如何在vue项目中添加eslint. 首先第一种就是在vue项目创建初始时就选择了创建,随着初始化一起代入到了项目当中,那么要是一开始觉得es ...

  6. vue项目中使用bpmn-自定义platter

    前情提要 经过前四篇的学习,我们能够实现bpmn基本绘图.预览.为节点加事件加颜色等效果,这一篇我们来说,如何自定义左侧工具栏(platter),首先看一下自定义前后效果图对比: 我们本次要实现的目标 ...

  7. vue项目中使用ts(typescript)入门教程

    最近项目需要将原vue项目结合ts的使用进行改造,这个后面应该是中大型项目的发展趋势,看到一篇不错的入门教程,结合它并进行了一点拓展记录之.本文从安装到vue组件编写进行了说明,适合入门. 1.引入T ...

  8. 更换vue项目中标签页icon

    问题:在vue项目中, 需要将标签上的icon换成自己所需的,发现在更换了public/favicon.ico后,没有生效,依旧是原来Vue的icon. 解决办法:在vue.config.js中,修改 ...

  9. vue 项目中实用的小技巧

    # 在Vue 项目中引入Bootstrap 有时在vue项目中会根据需求引入Bootstrap,而Bootstrap又是依赖于jQuery的,在使用npm按照时,可能会出现一系列的错误 1.安装jQu ...

  10. 如何在VUE项目中添加ESLint

    如何在VUE项目中添加ESLint 1. 首先在项目的根目录下 新建 .eslintrc.js文件,其配置规则可以如下:(自己小整理了一份),所有的代码如下: // https://eslint.or ...

随机推荐

  1. Google全球分布式数据库:Spanner

    2012年的OSDI上google发布了Spanner数据库.个人认为Spanner对于版本控制,事务外部一致性的处理,使用TrueTime + Timestamp进行全球备份同步的实现都比较值得一看 ...

  2. 详解instanceof底层原理,从零手写一个instanceof

    壹 ❀ 引 本道题的核心考点还是对于javascript原型的掌握程度,比如__proto__,prototype相关概念,以及instanceof底层原理的理解.若你对于原型已经非常熟悉,那么可以直 ...

  3. JS 20道概念虽老但也略有收获的JS基础题,快速做题,高效复习,不妨试试?

    壹 ❀ 引 在7月21交接完所有工作后,我也进入了休年假的阶段(没用完的8天年假),看似休息内心的紧张感反而瞬间加倍,到今天为止也面了几家,好消息是工作机会特别特别多,一封简历没投,面试邀请源源不断, ...

  4. 【Unity3D】UGUI之Text

    1 Text 简介 ​ UGUI概述 中介绍了Canvas 渲染模式.RectTransform 组件.锚点(Anchor)等,本文将介绍 UGUI 中的 Text 控件. ​ 在 Hierarchy ...

  5. MySQL的MVCC概念介绍(转)

    并发字段修改业务 最近在主要在做"工作流引擎"课题的预研工作,在涉及到"会签任务"(工作流业务概念,这与我们今天讨论文问题没有太多关联)的时候,遇到了一个并发修 ...

  6. bootstrap与javascript

    1.bootstrap依赖 bootstrap依赖javascript类库,jQuery 下载jQuery,在页面上应用jQuery 在页面上应用bootstrap的js类库 <script s ...

  7. 列表相关函数,深浅拷贝,字典相关函数,集合相关操作及文件操作---day08

    1.列表的相关函数 append() 功能:向列表的末尾添加新的元素 格式:列表.append(值) 返回值:None 注意:新添加的值在列表的末尾,该函数直接操作原有列表 insert() 功能:在 ...

  8. vue 前端自动打开文件地址进行下载

    最近在做异步导出的功能,导出的过程中前端另外启动一个查询导出进度的线程接口.如果导出完成后,把生成的文件上传到服务器,返回给前端一个文件的下载地址:前端自动打开这个地址进行跳转下载. 有两种方式 1. ...

  9. 私有git服务器搭建-gitlib版

    目录 环境 centos6.5 这里有官网安装地址教程: 这里有机器配置安装需求 CPU Memory 安装步骤 安装配置依赖项 添加GitLab仓库,并安装到服务器上 启动GitLab 配置 git ...

  10. 【Azure 应用服务】Azure Web App 服务默认支持一些 Weak TLS Ciphers Suite,是否有办法自定义修改呢?

    问题描述 当 Azure Web App 进行安全扫描后,发现依旧支持很多弱TLS加密套件(Weak TLS Ciphers Suite),那么是否有办法来关闭这些弱的加密套件呢? 在Windows ...