React如何通过Webpack优雅的接入serviceWorker的成熟方案workBox && Google Analytics

2023-05-16

  • 背景介绍:

为了提高React应用的启动速度、离线访问能力, 做到页面能离线启动、service worker能在后台默默更新本地缓存的页面、数据的版本,并且做到监控版本更新能力的靠谱性。

终极方案:采用serviceWorker的成熟方案workBox通过Webpack的workbox官方插件workbox-webpack-plugin做到页面能离线启动、service worker能在后台默默更新本地缓存的页面、数据的版本, 通过Google Analytics做到监控版本更新能力的靠谱性(上报应用版本)。

简单来说就是: workbox-webpack-plugin 和 Google Analytics 的故事。

进入正题之前, 先来一些开胃菜:

  • PWA(Progressive Web Apps)

    • 借助 Service Worker 缓存网站的静态资源,甚至是网络请求,使网站在离线时也能访问。并且我们能够为网站指定一个图标添加在手机桌面,实现点击桌面图标即可访问网站。
  • serviceWorker

    • serviceWorker仅支持本地(localhost/127.0.0.x)的http协议和带有安全证书的https协议

    • Service Worker 是浏览器在后台独立于网页运行的脚本。是它让 PWA 拥有极快的访问速度和离线运行能力。

  • workBox

    • 其实可以把 Workbox 理解为 Google 官方的 PWA 框架,它解决的就是用底层 API 写 PWA 太过复杂的问题。这里说的底层 API,指的就是去监听 SW 的 install、active、 fetch 事件做相应逻辑处理等。
  • workbox-webpack-plugin

    • webpack通过配置插件(缓存策略), 简易接入workBox。

目录

workbox-webpack-plugin

  • 安装
  • 配置接入 (重点踩坑)
  • 解析配置

React如何接入Google Analytics, 做到监控离线的应用版本

  • 封装GA组件
  • 配置GA, 上报数据及版本
  • 后台查看上报的数据 (重点采坑)

甜品一: workbox-webpack-plugin

官方文档: developers.google.com/web/tools/w…

  • 安装: npm install workbox-webpack-plugin -D

  • 配置: webpack插件中使用~

webpack配置中引入插件


  
  1. const { GenerateSW } = require('workbox-webpack-plugin')

  2. exports.override = (webpackConfig, options) => {

  3. webpackConfig.plugins.push(new GenerateSW({

  4. swDest: 'workboxServiceWorker.js', // 注意点1: 不写这个名字, 插件默认会生成 service-worker.js 这个文件,然后不知道WHO又生成了一次service-worker.js这个文件(内容不是workbox预期), 所以webpack生成的workbox的脚本就这样被替换了! 导致插件配置好的文件其实没被写出!!!

  5. // 当我们每次访问网站时都会去下载这个文件,当发现文件不一致时,就会安装这个新 Service Worker ,安装成功后,它将进入等待阶段。

  6. importWorkboxFrom: 'disabled', // 可填`cdn`,`local`,`disabled`, 区别下面整理

  7. importScripts: 'https://fds.api.x.net/workbox-cdn/workbox-sw.js', // 我从自己的cdn引入了workbox,这样就不用每个项目都上传

  8. // 这三个都写true

  9. skipWaiting: true, // 新 Service Worker 安装成功后需要进入等待阶段,skipWaiting: true 将使其跳过等待,安装成功后立即接管网站。

  10. clientsClaim: true, // 立即接管

  11. offlineGoogleAnalytics: true, // 离线也记录ga数据, 有网了再上报的意思。

  12. cleanupOutdatedCaches: true, // 尝试删除老版本缓存

  13. // 缓存规则, 具体下面记录, 更详细的请查阅文档。 目前只缓存api

  14. runtimeCaching: [

  15. {

  16. urlPattern: /^https:\/\/easy-mock\.com\//,

  17. handler: 'NetworkFirst',

  18. options: {

  19. cacheName: 'cached-api',

  20. networkTimeoutSeconds: 2,

  21. expiration: {

  22. maxEntries: 50,

  23. maxAgeSeconds: 1 * 24 * 60 * 60, // 1 day

  24. },

  25. cacheableResponse: {

  26. statuses: [0, 200],

  27. },

  28. },

  29. },

  30. ],

  31. }))

  32. return webpackConfig

  33. }

  34. 复制代码

  • 在react入口js的代码里注册代码, 你也可以选择在public下的index.html模板里的script标签里写(别说我教你们的)

  
  1. if ('serviceWorker' in navigator) {

  2. window.addEventListener('load', () => {

  3. // 敲黑板, 这里的/workbox/workboxServiceWorker.js需要根据实际情况变化, 因为我项目没部署到根域名, 所以加了workbox的路径名...

  4. // 注意: 这里有个坑 workboxServiceWorker 会被缓存, 解决方案在下面的坑点介绍

  5. navigator.serviceWorker.register('/workbox/workboxServiceWorker.js').then(registration => {

  6. console.log('SW registered: ', registration)

  7. }).catch(registrationError => {

  8. console.log('SW registration failed: ', registrationError)

  9. })

  10. })

  11. }

  12. 复制代码

坑点:

  1. swDest: 'workboxServiceWorker.js'

官方文档中, 这个选项是可选填, 默认值为: service-worker.js。我遇到的问题是, 如果不写这个重新写出一个文件, 不知道是哪个"B", 也写出了一个叫service-worker.js的文件, workBox的先写出来了, 然后又被一个同名文件写出覆盖了! 然后你自认为接入了workbox, 实际上你不知道你接入的是啥。(有可能这个文件也是workbox写出的,但是的确不是我想要的,虽然能实现缓存,但怎么实现的,以及实现的完全不是你想要的效果, 它完全没有引入workbox, 对, 故事就是这样。)

  1. importWorkboxFrom 和 importScripts

    importWorkboxFrom可以选填三个值: cdn,local,disabled

    • cdn: 引入google的官方cdn, 后果是国内用户打开网站, 一脸懵逼的被墙 (所以肯定不能用这个默认值!!!)
    • local: workbox人性化的在本地写出了workbox的代码, 然后和项目代码一起上传部署就ok, 但每个项目都要这样, 就很麻烦。
    • disabled: 傲娇的不从谷歌引入, 也不导出的本地。但如果你不配置: importScripts 的引入地址, 那将一脸懵逼。

    所以我最终的方案:

    
      
    1. importWorkboxFrom: 'disabled',

    2. importScripts: 'https://fds.api.x.net/workbox-cdn/workbox-sw.js', // 把local模式导出的文件, 先部署获取到cdn链接, 在写死就ok

    3. 复制代码

  2. runtimeCaching: 具体的运行时缓存策略通过这个选项配置, 具体的需要实战或者根据自己的业务调整, 注意下面第四点, runtimeCaching中无需放置代码页面的缓存

  3. 缓存分为precache 和 runningCache, 打包之后的代码, 会自己加入到precache中, 所以无需再运行时配置缓存资源, 比如:

具体预缓存的文件可以看precache-manifest.xxxxxx.js

在文档中搜索precache, 有更多可以配置的, 比如: include/exclude || chunks/excludeChunks


  
  1. // 没必要!!!

  2. runtimeCaching: [{

  3. // cdn资源,这个原本想缓存的是代码,实则已经被预缓存了

  4. urlPattern: new RegExp('^https://cdn.net'),

  5. handler: 'staleWhileRevalidate',

  6. options: {

  7. cacheableResponse: {

  8. statuses: [200],

  9. },

  10. },

  11. },]

  12. 复制代码

  1. 浏览器兼容坑点:

测试了PC端: 谷歌, 火狐, QQ浏览器, UC浏览器 || 移动端: QQ浏览器, miui浏览器

  • 谷歌, 火狐正常, 能更新最新版本缓存以及更新页面 (当发现代码有变化的时候)
  • QQ浏览器 || UC浏览器: 这两个傻蛋, 把最主要的workboxServiceWorke.js这个文件居然自动硬盘缓存了!!! 导致读取不到最新的代码版本, 去获取最新版的代码!

 

解决方案

方法一:


  
  1. `/workbox/workboxServiceWorker.js?${Date.now()}` // 在workboxServiceWorker.js 后加上时间戳, 禁止被缓存!!!

  2. 复制代码

方法二: FDS上配置workboxServiceWorker.js的响应头, 禁止缓存

解析配置

主要解析runtimeCaching中的缓存策略 (只在demo中测试, 没接正式项目, 不知道有没有更多的坑点)

  • Stale While Revalidate (主要)

    这种策略的意思是当请求的路由有对应的 Cache 缓存结果就直接返回,在返回 Cache 缓存结果的同时会在后台发起网络请求拿到请求结果并更新 Cache 缓存,如果本来就没有 Cache 缓存的话,直接就发起网络请求并返回结果,这对用户来说是一种非常安全的策略,能保证用户最快速的拿到请求的结果,但是也有一定的缺点,就是还是会有网络请求占用了用户的网络带宽。

    用来做CSS,JS,PNG等资源的策略, 觉得蛮好。

  • Network First (次主要)

    这种策略就是当请求路由是被匹配的,就采用网络优先的策略,也就是优先尝试拿到网络请求的返回结果,如果拿到网络请求的结果,就将结果返回给客户端并且写入 Cache 缓存,如果网络请求失败,那就读取Cache中的数据,这种策略一般适用于返回结果不太固定或对实时性有要求的请求,为网络请求失败进行兜底。

    用来做API接口的,也许就是这样。

  • Cache First

    这个策略的意思就是当匹配到请求之后直接从 Cache 缓存中取得结果,如果 Cache 缓存中没有结果,那就会发起网络请求,拿到网络请求结果并将结果更新至 Cache 缓存,并将结果返回给客户端。这种策略比较适合结果不怎么变动且对实时性要求不高的请求。

  • Network Only

    比较直接的策略,直接强制使用正常的网络请求,并将结果返回给客户端,这种策略比较适合对实时性要求非常高的请求。

  • Cache Only

    这个策略也比较直接,直接使用 Cache 缓存的结果,并将结果返回给客户端,这种策略比较适合一上线就不会变的静态资源请求。( - - 你敢确定不会变吗...)

甜品二: React如何接入Google Analytics, 做到监控离线的应用版本

React项目接入GA, 封装GA, 使用了react-ga

GA官方上报的字段及含义: developers.google.com/analytics/d…


  
  1. import React from 'react'

  2. import ReactGA from 'react-ga'

  3. // eslint-disable-next-line

  4. export default function withTracker(WrappedComponent, option = {}) {

  5. const trackingId = 'UA-xxxxxxx-x'

  6. const trackPage = page => {

  7. ReactGA.initialize(trackingId, {

  8. gaOptions: {

  9. siteSpeedSampleRate: 100, // 上报网站速度的比例, 默认10%, 如果网站量比较大, 那就不用设置100%了。

  10. },

  11. })

  12. const app = {

  13. appName: 'workBoxDemo',

  14. appVersion: '1.3',

  15. } // 上报版本

  16. console.log(app)

  17. ReactGA.set(app)

  18. ReactGA.pageview(page)

  19. }

  20. // eslint-disable-next-line

  21. const HOC = class extends React.Component {

  22. componentDidMount() {

  23. const page = this.props.location.pathname

  24. trackPage(page)

  25. }

  26. componentWillReceiveProps(nextProps) {

  27. const currentPage = this.props.location.pathname

  28. const nextPage = nextProps.location.pathname

  29. if (currentPage !== nextPage) {

  30. trackPage(nextPage)

  31. }

  32. }

  33. render() {

  34. return <WrappedComponent {...this.props} />

  35. }

  36. }

  37. return HOC

  38. }

  39. 复制代码

然后在需要引入GA的页面的react加上withTracker修饰器即可~

 

后台查看上报的数据

添加方法: ( 自定义->自定义报告 )

 

 

相关资源:...应用程序而无需弹出-源码_reactworkbox-其它代码类资源-CSDN文库

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React如何通过Webpack优雅的接入serviceWorker的成熟方案workBox && Google Analytics 的相关文章

  • 笔试算法:青蛙跳台阶

    笔试算法 xff1a 青蛙跳台阶 1 题目表述 假设青蛙正在跳台阶 需要 n 阶你能到达楼顶 每次青蛙可以跳 1 或 2 个台阶 xff0c 但不可以连续跳2个 请问有多少种不同的方法可以到楼顶呢 xff1f 注意 xff1a 给定 n 是
  • 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数

    输入一行字符 xff0c 分别统计出其中英文字母 空格 数字和其他字符的个数 首先需要判断各自所出的范围 xff1a 中英文字母 xff1a a到z A到Z 空格 xff1a 空一个字符 数字 xff1a 1 9 然后则对一串字符进行逐个比
  • 逆波兰式的实现及表达式的值

    逆波兰式的实现 1 概念 逆波兰式也叫后缀表达式 xff0c 这里先简单帮大家理解一下概念性问题 像我们平常使用到的表达式如 a 43 b c
  • C语言栈的用法(创建、入栈、出栈、遍历)

    C语言栈的用法 xff08 创建 入栈 出栈 遍历 xff09 本篇博客主要简单介绍如何使用C语言构建栈 xff0c 元素入栈 xff0c 元素出栈以及遍历所有的栈内元素 1 栈的定义 首先对栈进行定义 xff0c 构建一个简单的结构体 x
  • 我印象中的徐志摩

    我印象中徐志摩 在我上中学的时候 xff0c 徐志摩对于我来说是一个神圣不可侵犯的名字 xff0c 那么一个具有才华和能力 xff0c 从他的作品里感受到他那浪漫的文艺气息和对自由生活的追求 xff0c 无不令我们这些初入青春期的孩子们留下
  • 根据文法规则,判断文法类型

    根据文法规则 xff0c 判断文法类型 1 实验要求 输入 xff1a 文法规则 输出 xff1a 文法类型 2 实验原理 文法规则 xff1a 以四元组的形式展示出来 xff1a 文法G 定义为四元组G 61 Vn Vt P S Vn x
  • 根据文法进行表达式推导

    根据文法进行表达式推导 xff08 编译原理 xff09 1 实验要求 已知文法 xff1a E gt T E 43 T T gt F T F F gt E i 请给出下述表达的推导公式 xff1a i 43 i i i 43 i i 2
  • (编译原理)正规文法转正规式(原代码)

    xff08 编译原理 xff09 正规文法转正规式 一 实验要求 输入 xff1a 正规文法输出 xff1a 正规式 例 xff1a 输入 xff1a S gt aB B gt b 输出 xff1a ab 输入 xff1a S gt aS
  • PDF转Word转换器

    PDF转换器 这款PDF转换器可以将PDF文件转换为Word Excel和PPT等 而且是免费的 xff0c 不用考虑PDF页数问题 xff0c 全都是免费的哦 1 安装链接 https pan baidu com s 18ySVrh wn
  • 构造LL(1)文法的递归下降子程序

    构造LL 1 文法的递归下降子程序 1 要求 输入 LL 1 文法输出 xff1a 递归下降子程序如 xff1a 文法G S S AaS BbS d A a B e若输入 xff1a aad 则输出 xff1a S AaS A a S d
  • 编译原理LL(1)文法的判断(first集、follow集和select集)

    编译原理LL 1 文法的判断 xff08 first集 follow集和select集 xff09 1 问 如何通过给定的文法 xff0c 判断该文法是否是LL 1 文法 xff1f 2 答 求出该文法的first集 follow集和sel
  • Matlab2017A安装教程

    Matlab2017A安装教程 1 链接 链接 xff1a https pan baidu com s 13BO9i885aOMIvX9z5Dh CQ 提取码 xff1a 0p44 2 安装步骤 首先进入链接进行保存下载 xff0c 解压文
  • LR(0)分析表的构建

    LR 0 分析表的构建 一 实验要求 构建LR xff08 0 xff09 分析表 例 xff1a G E E gt aA E gt bB A gt cA A gt d B gt cB B gt d 二 实验原理 在网上找了好久 xff0c
  • 子非鱼

    子非鱼 前几天在微信的一个公众号上面看到了一个推荐的纪录片 xff0c 叫做 子非鱼 xff0c 讲述的是居住在香港的底层人民的生活状况 xff0c 他们孩子的上学历程 xff0c 看着颇为感叹 里面主要是围绕着余伟豪及其同学的学习生活进行
  • Michael Scofield in Break Prison(越狱)

    Michael Scofield in Break Prison xff08 越狱 xff09 前段时间紧赶慢赶将越狱的最后一季给看完了 xff0c 着实内心极度的不平静 记得最开始看第一季第一集时 xff0c 还是因为听说非常之好看 男主
  • 计算机类期刊投稿心得

    1 杂志名称 计算机应用研究 成都 杂志文章包含专业 建模 xff0c 仿真 xff0c 网络 xff0c 人工智能 xff0c 比较杂 投稿联系方式 注册在线投稿审稿 投稿费用 审稿费无 xff0c 250元 页 杂志级别 国家一级期刊
  • 《物流配送中VRP问题的多目标优化方法研究》个人小结

    物流配送中VRP问题的多目标优化方法研究 个人小结 物流配送中VRP问题的多目标研究方法 xff0c 自从去年开始了这项大学生创新创业 xff0c 就一直围绕在我的身边 xff0c 时时刻刻会想着她 xff0c 尽可能地去多学一点相关的VR
  • 《科研方法导论》

    科研方法导论 这本书在开学的时候听说有这门课要上就在网上下单了 xff0c 目前已将近一整个学期过去了 xff0c 距离老师的最后一次课也有好几个月了 xff0c 才新建一份Word文档准备将老师上课所讲述的知识和这本书的整体内容进行读后感
  • 语义计算的递归下降(预测)翻译程序

    语义计算的递归下降 xff08 预测 xff09 翻译程序 一 实验内容 实现属性文法的递归下降翻译程序 xff27 xff3b xff2e xff3d xff1a N gt S S f 61 1 print S v S gt BS1 S1
  • MyDockFinder Steam版的新增功能和下载

    文末附下载链接 1 增加两个新的开机启动方式 xff0c 分别是注册表和计划任务 xff0c 防止开机不能启动问题 xff0c 下面解释一下三种开机启动方式的区别和功能 注册表 xff1a 速度最慢 但是启动稳定几乎没有开机不能启动的情况

随机推荐