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-pwaVite提供的便利性插件,让你通过简单的配置即可完成离线应用。

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 已经支持离线应用了

相关推荐
通往曙光的路上3 小时前
vue啊哈哈哈哈哈哈哈哈
前端·javascript·vue.js
fouryears_234173 小时前
如何将Vue 项目转换为 Android App(使用Capacitor)
android·前端·vue.js
小高0074 小时前
🤔Proxy 到底比 defineProperty 强在哪?为什么今天还在聊 Proxy?
前端·javascript·vue.js
FuckPatience5 小时前
电脑所有可用的网络接口
前端·javascript·vue.js
前端开发爱好者5 小时前
尤雨溪宣布:Vite 纪录片震撼发布!
前端·javascript·vue.js
科兴第一吴彦祖5 小时前
基于Spring Boot + Vue 3的乡村振兴综合服务平台
java·vue.js·人工智能·spring boot·推荐算法
Man7 小时前
🔥 Vue3 动态 ref 黑科技:一招解决 v-for 中的组件引用难题!
前端·vue.js
叫我少年7 小时前
Vue3 集成 VueRouter
vue.js
披萨心肠7 小时前
Vue单向数据流下双向绑定父子组件数据
vue.js