Vue 3 30天精进之旅:Day 25 - PWA支持
一、引言
在前面的24天中,我们已经深入探讨了Vue 3的许多核心概念和高级特性。今天,我们将进入一个全新的领域——PWA(Progressive Web App)。PWA是一种现代Web应用程序的开发模式,它结合了Web和原生应用的优点,能够提供更流畅的用户体验。在Vue 3中,我们可以轻松地为我们的应用添加PWA支持。本文将带你一步步实现这一目标。
二、什么是PWA?
PWA(Progressive Web App,渐进式Web应用)是一种通过现代Web技术构建的应用程序,它结合了Web和原生应用的优点,能够提供更流畅、更接近原生应用的用户体验。PWA的核心目标是通过一系列技术手段,让Web应用具备以下特性:
1. 可离线访问
PWA通过Service Worker技术实现了离线访问功能。Service Worker是一种运行在浏览器后台的脚本,它可以拦截网络请求,并将资源缓存到本地。当用户在没有网络连接的情况下访问应用时,Service Worker可以从缓存中提供资源,确保应用仍然可用。
2. 快速加载
PWA利用缓存机制和资源预加载技术,能够显著提升应用的加载速度。通过缓存关键资源(如HTML、CSS、JavaScript文件),PWA可以在用户再次访问时快速加载页面,减少等待时间,提供流畅的用户体验。
3. 可安装
PWA支持添加到主屏幕的功能。用户可以将PWA像原生应用一样安装到设备的主屏幕上,并通过图标直接启动。这种体验让PWA更加接近原生应用,同时也减少了用户对应用商店的依赖。
4. 响应式设计
PWA采用响应式设计,能够适应不同的设备和屏幕尺寸。无论是桌面、平板还是手机,PWA都能提供一致的用户体验。
5. 安全性
PWA必须运行在HTTPS协议下,以确保数据传输的安全性。HTTPS不仅保护用户数据,还能防止恶意攻击。
6. 推送通知
PWA支持推送通知功能,能够像原生应用一样向用户发送通知。这种功能可以提升用户参与度,增加应用的粘性。
7. 跨平台
PWA基于Web技术开发,因此可以在任何支持现代浏览器的平台上运行,包括Windows、macOS、Android和iOS。这种跨平台特性大大降低了开发和维护成本。
三、在Vue 3中添加PWA支持
在Vue 3中,我们可以通过@vue/cli-plugin-pwa插件轻松地为应用添加PWA支持。以下是详细的实现步骤:
1. 安装PWA插件
首先,确保你的项目是基于Vue CLI创建的。如果还没有安装Vue CLI,可以通过以下命令安装:
npm install -g @vue/cli
然后,在项目根目录下运行以下命令,添加PWA插件:
vue add pwa
这个命令会自动安装@vue/cli-plugin-pwa插件,并在项目中生成相关的配置文件。
2. 配置PWA
安装完成后,你会在项目根目录下看到一个vue.config.js文件。这个文件中包含了PWA的配置选项。以下是一个常见的配置示例:
module.exports = {pwa: {name: 'My PWA App', // 应用名称themeColor: '#4DBA87', // 主题颜色msTileColor: '#000000', // Windows磁贴颜色appleMobileWebAppCapable: 'yes', // 是否启用iOS全屏模式appleMobileWebAppStatusBarStyle: 'black', // iOS状态栏样式manifestOptions: {background_color: '#ffffff', // 背景颜色icons: [{src: './img/icons/icon-192x192.png', // 图标路径sizes: '192x192',type: 'image/png'},{src: './img/icons/icon-512x512.png',sizes: '512x512',type: 'image/png'}]},workboxPluginMode: 'GenerateSW', // 使用GenerateSW模式生成Service WorkerworkboxOptions: {skipWaiting: true, // 跳过等待,立即激活新Service WorkerclientsClaim: true, // 控制所有客户端runtimeCaching: [{urlPattern: /^https:\/\/api\.example\.com\/.*/, // 缓存API请求handler: 'NetworkFirst',options: {cacheName: 'api-cache',expiration: {maxEntries: 50,maxAgeSeconds: 60 * 60 * 24 // 缓存1天}}}]}}
}
在这个配置中,我们定义了应用的名称、主题颜色、图标等。workboxPluginMode和workboxOptions用于配置Service Worker的行为。
3. 生成Service Worker
Service Worker是PWA的核心技术之一,它负责缓存资源并处理网络请求。在Vue 3中,我们可以通过workbox-webpack-plugin自动生成Service Worker。
在vue.config.js中,我们已经配置了workboxPluginMode为GenerateSW,这意味着Vue CLI会自动为我们生成Service Worker。你可以在src目录下找到一个registerServiceWorker.js文件,这个文件用于注册Service Worker。registerServiceWorker.js文件的内容如下:
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)}})
}
这个文件会在生产环境中自动注册Service Worker,并监听Service Worker的生命周期事件,如缓存成功、更新可用等。
4. 自定义Service Worker
如果你需要更复杂的Service Worker逻辑,可以将workboxPluginMode设置为InjectManifest,并在src目录下创建一个自定义的Service Worker文件(例如src/service-worker.js)。然后在vue.config.js中配置workboxOptions,指定自定义Service Worker的路径:
module.exports = {pwa: {workboxPluginMode: 'InjectManifest',workboxOptions: {swSrc: './src/service-worker.js' // 自定义Service Worker文件路径}}
}
在自定义的Service Worker文件中,你可以使用Workbox API实现更高级的缓存策略,例如动态缓存、缓存清理等。
5. 测试PWA功能
完成配置后,我们可以通过以下步骤测试PWA功能:
- 构建项目:运行
npm run build命令,构建生产环境的应用。 - 启动本地服务器:使用
serve或其他静态文件服务器,启动一个本地服务器来测试构建后的应用。npm install -g serve serve -s dist - 检查PWA功能:
- 离线访问:在浏览器中打开应用,然后断开网络连接,刷新页面,检查应用是否仍然可以访问。
- 添加到主屏幕:在移动设备或支持PWA的桌面浏览器中,检查是否可以将应用添加到主屏幕。
- 缓存资源:打开开发者工具,查看
Application选项卡中的Cache Storage,确认资源是否被正确缓存。
6. 部署PWA
当你确认PWA功能正常后,可以将应用部署到生产环境。PWA可以在任何支持HTTPS的服务器上运行。确保你的服务器配置正确,并且所有资源都能够被正确缓存。
7. 优化PWA体验
为了进一步提升PWA的用户体验,你可以考虑以下优化措施:
- 预加载关键资源:在
index.html中使用<link rel="preload">标签预加载关键资源,加快页面加载速度。 - 使用Web App Manifest:在
public/manifest.json中配置应用的图标、主题颜色、启动URL等,确保应用在添加到主屏幕时显示正确的信息。 - 实现推送通知:使用Push API和Notification API实现推送通知功能,提升用户参与度。
四、PWA在实际项目中的应用场景与最佳实践
PWA不仅仅是一种技术,更是一种提升用户体验和开发效率的解决方案。在实际项目中,PWA可以应用于多种场景,并带来显著的价值。以下是PWA的一些典型应用场景以及最佳实践:
1. 应用场景
(1)电商平台
电商平台通常需要快速加载和流畅的用户体验,以提升转化率。通过PWA,电商平台可以实现以下功能:
- 离线浏览:用户可以在没有网络连接的情况下浏览商品信息。
- 快速加载:通过缓存商品图片和页面资源,减少加载时间。
- 推送通知:向用户发送促销信息或订单状态更新。
(2)新闻和博客
新闻和博客类应用需要频繁更新内容,同时保证用户能够快速访问。PWA可以帮助实现:
- 离线阅读:用户可以将文章缓存到本地,离线阅读。
- 即时更新:通过Service Worker的更新机制,确保用户始终看到最新的内容。
- 添加到主屏幕:用户可以将新闻应用添加到主屏幕,方便随时访问。
(3)社交媒体
社交媒体应用需要实时性和互动性。PWA可以支持:
- 实时消息推送:通过推送通知功能,及时通知用户新消息或动态。
- 离线发布:用户可以在离线状态下撰写内容,待网络恢复后自动发布。
- 快速加载:通过缓存用户数据和媒体资源,提升加载速度。
(4)企业内部应用
企业内部应用(如CRM、ERP系统)通常需要跨平台和离线支持。PWA可以:
- 跨平台运行:在桌面和移动设备上无缝运行,减少开发成本。
- 离线操作:员工可以在没有网络连接的情况下继续工作,数据会在网络恢复后同步。
2. 最佳实践
(1)优化缓存策略
PWA的核心是缓存,因此需要根据应用的特点设计合理的缓存策略。以下是一些常见的缓存策略:
- 缓存优先:对于静态资源(如CSS、JavaScript文件),使用缓存优先策略,确保快速加载。
- 网络优先:对于动态内容(如API数据),使用网络优先策略,确保用户获取最新数据。
- 缓存清理:定期清理过期的缓存,避免占用过多存储空间。
(2)使用Web App Manifest
manifest.json文件是PWA的重要组成部分,它定义了应用的元数据。以下是一个典型的manifest.json配置示例:
{"name": "My PWA App","short_name": "PWA","start_url": "/","display": "standalone","background_color": "#ffffff","theme_color": "#4DBA87","icons": [{"src": "/img/icons/icon-192x192.png","sizes": "192x192","type": "image/png"},{"src": "/img/icons/icon-512x512.png","sizes": "512x512","type": "image/png"}]
}
(3)实现推送通知
推送通知是PWA的重要功能之一,可以提升用户参与度。以下是一个简单的推送通知实现示例:
// 请求通知权限
Notification.requestPermission().then(permission => {if (permission === 'granted') {// 显示通知new Notification('Hello!', {body: 'This is a push notification from your PWA.',icon: '/img/icons/icon-192x192.png'});}
});
(4)测试与监控
在开发PWA时,测试和监控是必不可少的环节。以下是一些常用的工具和方法:
- Lighthouse:使用Google Chrome的Lighthouse工具测试PWA的性能、可访问性和PWA特性。
- Workbox Debugging:在开发环境中启用Workbox的调试模式,查看缓存和Service Worker的行为。
- 用户反馈:收集用户对PWA功能的反馈,持续优化体验。
(5)渐进增强
PWA的核心思想是渐进增强,即在不影响基础功能的前提下,逐步添加高级特性。在开发过程中,应确保应用在不支持PWA的浏览器中仍然能够正常运行。
3. 案例分享
(1)Twitter Lite
Twitter Lite是Twitter推出的PWA版本,它显著提升了加载速度和用户体验。通过PWA技术,Twitter Lite实现了以下功能:
- 快速加载:页面加载时间减少了30%。
- 离线访问:用户可以在离线状态下浏览已加载的内容。
- 推送通知:及时通知用户新消息和动态。
(2)Pinterest
Pinterest通过PWA技术提升了用户参与度和转化率。以下是Pinterest PWA的主要改进:
- 加载速度提升:Pinterest的PWA版本将页面加载时间从23秒减少到5.6秒,显著提升了用户体验。
- 用户参与度增加:通过推送通知和离线功能,用户活跃度提升了60%。
- 安装率提高:用户将Pinterest PWA添加到主屏幕的比例提高了50%。
(3)Starbucks
Starbucks的PWA版本为用户提供了流畅的点单体验,即使在没有网络连接的情况下也能使用。以下是Starbucks PWA的关键特性:
- 离线点单:用户可以在离线状态下浏览菜单并下单,订单会在网络恢复后自动提交。
- 快速加载:通过缓存资源,PWA版本加载速度比原生应用更快。
- 跨平台支持:PWA版本可以在任何设备上运行,减少了开发和维护成本。
五、PWA的未来发展趋势
随着Web技术的不断发展,PWA的应用场景和功能也在不断扩展。以下是PWA未来的一些发展趋势:
1. 更强大的离线能力
未来的PWA将支持更复杂的离线功能,例如离线数据库同步、离线支付等。这将进一步缩小PWA与原生应用之间的差距。
2. 与原生API的深度集成
随着Web API的不断丰富,PWA将能够访问更多原生设备功能,例如蓝牙、NFC、AR/VR等。这将使PWA在更多领域发挥重要作用。
3. 跨平台开发的主流选择
PWA的跨平台特性使其成为开发者的首选。未来,更多的企业和开发者将选择PWA作为跨平台开发的主要技术栈。
4. 更智能的缓存策略
通过结合AI和机器学习技术,PWA将能够动态调整缓存策略,根据用户行为和网络条件优化资源加载。
5. 更广泛的应用场景
PWA将在更多领域得到应用,例如教育、医疗、金融等。通过PWA,这些领域可以提供更高效、更便捷的服务。
六、结语
通过今天的学习,我们成功地为Vue 3应用添加了PWA支持。PWA不仅能够提升用户体验,还能够让我们的应用更具竞争力。在未来的开发中,PWA将成为Web应用开发的重要趋势之一。希望本文能够帮助你在Vue 3中轻松实现PWA功能。
在接下来的几天中,我们将继续探索Vue 3的其他高级特性和最佳实践。敬请期待!
相关资源:
- Vue CLI PWA Plugin Documentation
- Workbox Documentation
- PWA 官方文档
相关文章:
Vue 3 30天精进之旅:Day 25 - PWA支持
一、引言 在前面的24天中,我们已经深入探讨了Vue 3的许多核心概念和高级特性。今天,我们将进入一个全新的领域——PWA(Progressive Web App)。PWA是一种现代Web应用程序的开发模式,它结合了Web和原生应用的优点&#…...
机器学习-生命周期
假如一个用户向银行申请贷款,银行该如何对这个用户进行评估?很明显,银行首先需要调查清楚该用户的资金储备情况和信用历史等,然后再决定是否向其放款。 整个机器学习生命周期如下图所示: 1、定义问题 在使用机器学习中的术语表…...
大道至简 少字全意 易经的方式看 缓存 mybatis缓存 rendis缓存场景 案例
目录 介绍 mybatis缓存 一级缓存 1.是什么 2.特点 3.场景 mybatis 二级缓存 1.是什么 2.特点 3.配置步骤 注意 一级缓存问题 二级缓存问题 扩展 1.MyBatis集成 Redis 2.直接使用Redis redis 缓存 一、String 字符串 二、Llst 列表 三、Hash 哈希 四、Set…...
如何使用 Flutter DevTools 和 PerformanceOverlay 监控性能瓶颈
使用 Flutter DevTools 和 PerformanceOverlay 监控性能瓶颈:详细分析与实战 在开发 Flutter 应用时,性能问题可能会导致用户体验下降,比如页面卡顿、掉帧、内存泄漏等。为了定位和解决这些问题,Flutter 提供了强大的性能监控工具…...
TS中Any和Unknown有什么区别
在 TypeScript 中,any 和 unknown 都是顶级类型(top types),表示可以是任何类型的值。但它们在使用和行为上有显著区别,主要体现在类型安全性和使用方式上。 1. any 类型 特点: any 是 TypeScript 中最宽松…...
【Mpx】-环境搭建项目创建(一)
一.概述 官方文档:https://mpxjs.cn/guide/basic/start.html mpxjs/cli文档: https://github.com/mpx-ecology/mpx-cli 二.脚手架安装&创建项目 2.1项目创建 //脚手架安装 npm i -g mpxjs/cli //创建Mpx项目 mpx create mpx-demo(项目名称) //安装依赖 np…...
PyQt加载UI文件
1.动态加载 import sys from PySide6 import QtCore,QtWidgets from PySide6.QtWidgets import * from PySide6.QtUiTools import QUiLoaderclass readfile(QWidget):def __init__(self):super().__init__()self.uiQUiLoader().load("test.ui",self) self.__c…...
Java面试第二山!《计算机网络》!
在 Java 面试里,计算机网络知识是高频考点,今天就来盘点那些最容易被问到的计算机网络面试题,帮你轻松应对面试,也方便和朋友们一起探讨学习。 一、HTTP 和 HTTPS 的区别 1. 面试题呈现 HTTP 和 HTTPS 有什么区别?在…...
Mysql基础语句
一、 MySQL语句 在熟悉安装及访问 MySQL 数据库以后, 接下来将学习使用 MySQL 数据库的基本操作,这也是在服务器运维工作中不可或缺的知识。 本节中的所有数据库语句均在“MySQL>”操作环境中执行 MySQL 是一套数据库管理系统,在每台 MySQ…...
连接池Java导包
目录 一、Java导包 二、 数据库连接池 1. 概述 2. 常见参数 3. 常见连接池 4. Druid连接池(重点) 核心功能: 使用方法: 导入依赖 配置连接池: 代码配置: 配置文件: 获取连接&#…...
一些耳朵起茧子的名词解释
1 web应用 1.1 web应用的概念 Web应用(Web Application) 是一种通过浏览器访问的软件程序,它运行在服务器上,用户通过网络(如互联网或内网)与它进行交互。与传统网站(主要提供静态内容&#x…...
HBuilderX中,VUE生成随机数字,vue调用随机数函数
Vue 中可以使用JavaScript的Math.random() 函数生成随机数,它会返回 0 到 1 之间的浮点数, 如果需要0到1000之前的随机数,可以对生成的随机数乘以1000,再用js的向下取整函数Math.floor() 。 let randNum Math.random(); // 生成…...
C#发送邮件
基础调用类: public class EmailHelper{/// <summary>/// 发件人名称/// </summary>public string MailName { get; set; }/// <summary>/// 收件人/// </summary>public string MailTo { get; set; }/// <summary>/// 密送/// <…...
2025-2-19学习笔记 : this关键字,constructor结构体,class类
1、This关键字 在 JavaScript 中,this 是一个关键字,其指向取决于函数的调用方式。理解 this 的指向对于编写正确的代码至关重要。以下是 this 在不同情况下的指向规则: 1. 全局函数调用 当函数在全局作用域中被调用时,this 指向…...
避坑:过早的文件结束符(EOF):解决“git clone龙蜥OS源码失败”的失败过程
避坑:过早的文件结束符(EOF):解决“git clone龙蜥OS源码失败”的失败过程 安装Anolis OS 8.9 下载AnolisOS-8.9-x86_64-dvd.iso并安装。 使用uname -a查看内核版本为5.10.134-18.an8.x86_64。 [rootlocalhost cloud-kernel]# c…...
【Quest开发】全身跟踪
软件:Unity 2022.3.51f1c1、vscode、Meta XR All in One SDK V72 硬件:Meta Quest3 最终效果:能像meta的操作室沉浸场景一样根据头盔移动来推断用户姿势,实现走路、蹲下、手势匹配等功能 需要借助UnityMovement这个包 GitHub …...
通过BingAPI爬取Bing半个月内壁纸
通过BingAPI爬取Bing半个月内壁纸 一、前言二、爬虫代码三、代码说明 一、前言 爬取Bing搜索网站首页壁纸的方式主要有两种,第一种为间接爬取,即并不直接对Bing网站发起请求,而是对那些收集汇总了Bing壁纸的网站发起请求,爬取图片…...
Linux升级Anacodna并配置jupyterLab
在使用 Anaconda 的过程中,随着项目和需求的发展,可能需要升级 Anaconda 的 Base 环境中的 Python 版本。本文将详细介绍如何安全地进行升级,包括步骤、代码示例与最终流程图。 升级 Python 一、环境准备 在进行任何升级之前,建…...
ctfshow web入门 web11-web24
web11 web12 进来浏览网站,底部有一串数字,根据提示可能有用,访问robots.txt,发现禁止访问/admin/,进去看看发现需要输入用户名和密码,刚想爆破就猜对了,用户名是admin,密码是页面下…...
Windows 环境下配置多个不同版本的 Maven
在实际开发中,不同的项目可能需要使用不同版本的 Maven。例如,老项目可能依赖于 Maven 3.3,而新项目可能需要 Maven 3.8+ 才能正常运行。因此,在 Windows 下配置多个 Maven 版本并能方便地切换是非常必要的 1. 下载并安装多个 Maven 版本 1.1 下载 Maven 访问 Apache Mav…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
