Vue3项目使用PWA技术进行离线加载

技术简介

PWA(Progressive Web App,渐进式网页应用) 是一种融合了 网页(Web) 与 原生应用(Native App) 优点的技术。 它让你用网页技术(HTML、CSS、JavaScript)构建出一个能像原生应用那样:

  • 可以安装到桌面或手机;
  • 能在离线或网络差的情况下运行;
  • 能接收推送通知;
  • 启动速度快,体验接近原生 App;
  • 并且依然是通过浏览器访问,不需要上架应用商店。 换句话说,PWA = 网页 + 应用体验。

------ ChatGPT

简单来说,就是浏览器为你的网页提供了离线应用支持,它将你的网页所需资源缓存了下来,并拦截了页面请求,能匹配上这些资源的就直接存缓存中拿出来。

这里涉及到了两个重要的技术点:

  1. Service Worker:它是一个在浏览器后台运行的脚本,负责拦截网络请求、缓存资源、处理推送通知等。
  2. Manifest 文件:它是一个 JSON 格式的文件,用于描述你的 PWA 应用的名称、图标、启动 URL 等信息。

Service Worker 帮你实现离线使用与同步更新,Manifest 则告诉浏览器你配置的应用信息。

就像这样:

右上角会出现一个安装应用的按钮,点击即可安装到桌面。

核心原理

PWA的核心原理是利用Service Worker来拦截网络请求,匹配到缓存中的资源就直接返回,否则就去请求服务器。

而PWA检测更新的原理更加简单,当使用PWA时,会生成一个类似于检验码的js文件,文件地址是固定的。就像md5校验码一样,浏览器会定期请求这个文件,如果与本地的文件有差异则表示此网页有新的版本。

简单开始

以下内容弄个基于Vue3 + Vite进行说明。

安装vite-plugin-pwa

vite-plugin-pwa是Vite提供的便利性插件,让你通过简单的配置即可完成离线应用。

bash 复制代码
npm install vite-plugin-pwa

配置PWA

在vite.config.js中添加如下配置:

javascript 复制代码
import { VitePWA } from 'vite-plugin-pwa'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
  plugins: [
    vue(),
    VitePWA({
      registerType: 'autoUpdate', // 自动更新 service worker
      includeAssets: ['favicon.svg', 'favicon.ico', 'robots.txt', 'apple-touch-icon.png'],
      manifest: {
        name: 'My Vue App',
        short_name: 'VueApp',
        description: 'My awesome offline-ready Vue 3 app',
        theme_color: '#42b883',
        icons: [
          {
            src: 'pwa-192x192.png',
            sizes: '192x192',
            type: 'image/png'
          },
          {
            src: 'pwa-512x512.png',
            sizes: '512x512',
            type: 'image/png'
          }
        ]
      },
    })
  ]
})

参数说明

  • registerType : 更新类型,包括两个值['prompt' | 'autoUpdate'],prompt表示让用户进行弹窗确认来升级,autoUpdate表示自动进行的升级。
  • includeAssets: 你需要进行缓存的静态资源,比如favicon.ico、robots.txt等。
  • manifest : 应用清单,也就是应用信息。这里需要特别注意icons参数,它需要真实的图片地址与分辨率,如有错误则不会在浏览器上显示应用安装按钮。

进行升级配置

在main.js中添加如下内容:

javascript 复制代码
import { registerSW } from 'virtual:pwa-register'

const updateSW = registerSW({
  onNeedRefresh() {
    if (confirm('有新版本可用,是否立即更新?')) {
      updateSW(true)
    }
  },
  onOfflineReady() {
    console.log('应用已准备好离线使用')
  }
})

这里的updateSW定义是为了让开发者根据需要来进行手动升级,开发者可以通过调用updateSW(true)来手动进行页面更新。 你也可以不进行定义,这样只能等待用户手动关闭页面并重新打开才能完成新页面的载入。

小提示

  • 如果你是使用的类似于vite dev的开发模式,那么离线应用是不会生效的,你需要先对应用进行打包,然后再使用vite preview的方式进行预览。

  • 你可以打开f12,随后刷新网页来看一下是否缓存成功了(出现ServiceWorker则表示成功了):

  • 一页·ONE 已经支持离线应用了

相关推荐
蓝莓味的口香糖9 小时前
【VUE】【CSS】Vue移动端适配主流方案总结
前端·css·vue.js
切糕师学AI9 小时前
el-select-v2 深度解析:用虚拟滚动解决海量数据下拉选择性能瓶颈
前端·vue.js·elementui·el-select-v2
徐小夕10 小时前
JitOffice:把办公、AI 与审批装进同一个平台
前端·vue.js·github
徐小夕10 小时前
万字分享:为什么我们要自研Word解析引擎?JitWord 解析引擎 4.0 深度复盘
前端·vue.js·github
小大宇11 小时前
Vue知识点-ElementPlus-02图标
前端·javascript·vue.js
king王一帅12 小时前
给你的编辑器加上思维导图、流程图、白板:一套开源组件,多种文档通用
前端·vue.js·ai编程
console.log('npc')1 天前
周期任务功能完整实现:CRON 编辑器 + 模板变量 + 执行历史
javascript·vue.js·编辑器
qq_340040881 天前
idea2021版,vue项目的package.json不展示scripts的绿色箭头
javascript·vue.js·json
志尊宝1 天前
AI原生前端开发(037):AI辅助的Vue 3开发最佳实践
前端·vue.js·ai-native