当前位置:首页 > VUE

vue实现pwa

2026-03-07 10:17:14VUE

使用 Vue CLI 实现 PWA

Vue CLI 内置了 PWA 插件(@vue/cli-plugin-pwa),可以快速将 Vue 项目转换为 PWA。以下是具体实现步骤:

安装 Vue CLI(如已安装可跳过):

npm install -g @vue/cli

创建 Vue 项目:

vue create my-pwa-app

添加 PWA 插件:

vue add pwa

配置 PWA 参数

vue.config.js 中配置 PWA 选项:

module.exports = {
  pwa: {
    name: 'My PWA App',
    themeColor: '#4DBA87',
    msTileColor: '#000000',
    appleMobileWebAppCapable: 'yes',
    appleMobileWebAppStatusBarStyle: 'black',
    workboxPluginMode: 'GenerateSW',
    workboxOptions: {
      skipWaiting: true,
      clientsClaim: true,
    }
  }
}

注册 Service Worker

main.js 中注册 Service Worker:

import { register } from 'register-service-worker'

if (process.env.NODE_ENV === 'production') {
  register(`${process.env.BASE_URL}service-worker.js`, {
    ready() {
      console.log('App is being served from cache by a service worker.')
    },
    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)
    }
  })
}

创建 Manifest 文件

public 目录下创建 manifest.json

{
  "name": "My PWA App",
  "short_name": "PWA",
  "theme_color": "#4DBA87",
  "background_color": "#ffffff",
  "display": "standalone",
  "scope": "/",
  "start_url": "/",
  "icons": [
    {
      "src": "img/icons/android-chrome-192x192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "img/icons/android-chrome-512x512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ]
}

添加离线提示

App.vue 中添加离线状态检测:

mounted() {
  window.addEventListener('online', this.updateOnlineStatus)
  window.addEventListener('offline', this.updateOnlineStatus)
},
methods: {
  updateOnlineStatus() {
    this.isOnline = navigator.onLine
    if (!this.isOnline) {
      // 显示离线提示
    }
  }
}

构建和部署

构建生产环境版本:

npm run build

部署生成的 dist 目录到支持 HTTPS 的服务器,PWA 需要 HTTPS 才能正常工作。

测试 PWA 功能

使用 Lighthouse 工具测试 PWA 功能:

  1. 在 Chrome 中打开开发者工具
  2. 切换到 Lighthouse 标签
  3. 勾选 PWA 选项
  4. 运行测试

高级配置选项

对于更高级的缓存策略,可以修改 workboxOptions

vue实现pwa

workboxOptions: {
  runtimeCaching: [
    {
      urlPattern: /^https:\/\/api\.example\.com\/.*/,
      handler: 'NetworkFirst',
      options: {
        cacheName: 'api-cache',
        expiration: {
          maxEntries: 10,
          maxAgeSeconds: 60 * 60 * 24 // 1 day
        }
      }
    }
  ]
}

标签: vuepwa
分享给朋友:

相关文章

vue实现签约合作弹窗

vue实现签约合作弹窗

实现签约合作弹窗的步骤 使用Vue实现签约合作弹窗可以通过组件化方式完成,结合模态框和表单交互逻辑。以下是具体实现方法: 1. 创建弹窗组件 新建一个Vue组件文件(如SignContractDia…

vue实现mvc

vue实现mvc

Vue 实现 MVC 模式 Vue 本身是一个 MVVM(Model-View-ViewModel)框架,但可以通过结构调整实现 MVC(Model-View-Controller)模式。以下是具体实…

vue datepicker 实现

vue datepicker 实现

实现 Vue Datepicker 的基本方法 在 Vue 项目中实现日期选择功能,可以使用第三方库如 vue-datepicker 或 v-calendar。以下是两种常见实现方式: 安装 vue…

vue实现管道

vue实现管道

Vue 中实现管道(Pipe)功能 在 Vue 中可以通过过滤器(Filters)或计算属性(Computed Properties)实现类似管道的功能,将数据经过多个处理步骤后输出。 使用过滤器(…

vue实现剪辑

vue实现剪辑

Vue 实现视频剪辑功能 在Vue中实现视频剪辑功能通常需要结合HTML5的<video>元素和第三方库(如FFmpeg.js或Video.js)。以下是几种常见的实现方法: 使用FFm…

vue实现模块

vue实现模块

Vue 实现模块化的方法 Vue 支持多种模块化开发方式,可以根据项目需求选择适合的方案。 使用单文件组件(SFC) 单文件组件是 Vue 最常用的模块化方式,将模板、脚本和样式封装在一个 .vue…