详解基于vue的移动web app页面缓存解决方案
发布时间 - 2026-01-11 02:38:03 点击率:次现在移动web app越来越热门了,许多公司开始尝试使用angular、react、vue等MVVM框架来开发单页架构的web app。但在开发web app时,如果希望页面的导航体验也接近原生应用,那一般都会遇到这两个问题:

- 识别前进后退行为
- 后退时恢复之前的页面
笔者开发了一个基于vue与vue-router的导航库vue-navigation,来帮助开发者来解决这些问题,下面是问题的解决思路。
识别前进后退
先说第一个问题。和原生app不一样,浏览器中主要有这几个限制:
- 没有提供前进后退的事件
- 不允许开发者读取浏览记录
- 用户可以手动输入地址,或使用浏览器提供的前进后退来改变url
解决方案是自己维护一份浏览记录,每次url改变时,通过与记录的浏览记录作对比,从而判断出前进后退行为:
- url存在于浏览记录中即为后退
- url不存在于浏览记录中即为前进
- url在浏览记录的末端即为刷新
另外,应用的路由路径中可能允许相同的路由出现多次(例如A->B->A),所以给每个路由添加一个key值来区分相同路由的不同实例。
这个浏览记录需要存储在sessionStorage中,这样用户刷新后浏览记录也可以恢复。
后退时恢复之前的页面
识别出后退行为后,下一步就是像原生一样恢复之前的页面了。
一种方案是页面继续存储在DOM中,添加样式display: none来告诉浏览器不渲染该元素,但是缓存的页面多了DOM就会变得很大,会影响页面的性能,本文不讨论这个方案。
另一种方案是将数据缓存到内存中,开发者需要将页面的数据存储起来,当返回到该页面时,再根据数据将页面恢复。但是这样每个页面存储的数据不通,一般需要进行额外的编码,如果有一种更底层的方案能解决这个问题,并且对开发者是透明的,就最好了,所以尝试并开发了vue-navigation。
在vue-navigation 0.x版本的时候,借助了vue的keep-alive来缓存页面,但是keep-alive是根据组件的name或tag来决定缓存的,所以带来了很多限制。
通过拜读keep-alive的源码,了解到它的缓存机制后,就自己实现了一个管理缓存的组件,来灵活地缓存子组件,实现思路如下:
- 每次render时,先取到子组件的vnode(vue的虚拟dom)
- 计算出vnode的key,把key值赋给vnode避免vue-router复用组件实例
- 根据key值判断该节点是否已缓存
- 已缓存:将缓存的实例赋给componentInstance,这样vue就会根据这个实例来恢复组件
- 未缓存:将vnode存储到内存中,下次返回到该页面时可以从内存中恢复
另外还需要添加一个清除缓存的逻辑,当自己维护的浏览记录变化时,根据浏览记录清除不需要的缓存(例如当前的路由是:A->B->C,用户从C直接返回到了A,那么B和C都需要从缓存中删除)。
最后
虽然是基于vue来开发的,但是思路是不变的,使用其他框架也可以做到同样的事情。
还是安利一下vue和vue-navigation。使用插件后,再将router-view放在navigation下就有缓存功能了。
main.js
import Vue from 'vue'
import router from './router' // vue-router 实例
import Navigation from 'vue-navigation'
Vue.use(Navigation, {router})
// 启动你的应用...
App.vue
<template> <navigation> <router-view></router-view> </navigation> </template>
最后欢迎大家讨论或提供更好的解决方案。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# vue
# 页面缓存
# vue.js
# vue移动端项目中如何实现页面缓存的示例代码
# vue页面跳转实现页面缓存操作
# Vue2.0 实现页面缓存和不缓存的方式
# vue项目强制清除页面缓存的例子
# vuex + keep-alive实现tab标签页面缓存功能
# vue服务端渲染页面缓存和组件缓存的实例详解
# Vue项目全局配置页面缓存之按需读取缓存的实现详解
# 详解vue之页面缓存问题(基于2.0)
# vue实现页面缓存功能
# 即为
# 就会
# 到该
# 好了
# 放在
# 第一个
# 就有
# 不需要
# 开发了
# 有一种
# 但在
# 这两个
# 带来了
# 不存在
# 欢迎大家
# 还需要
# 那一
# 用户可以
# 这几个
# 再将
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
如何在阿里云购买域名并搭建网站?
SQL查询语句优化的实用方法总结
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
Laravel怎么上传文件_Laravel图片上传及存储配置
JavaScript实现Fly Bird小游戏
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
非常酷的网站设计制作软件,酷培ai教育官方网站?
详解Android中Activity的四大启动模式实验简述
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
Python制作简易注册登录系统
微信小程序制作网站有哪些,微信小程序需要做网站吗?
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
浅析上传头像示例及其注意事项
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
黑客如何通过漏洞一步步攻陷网站服务器?
如何在宝塔面板创建新站点?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
Python进程池调度策略_任务分发说明【指导】
中山网站推广排名,中山信息港登录入口?
网站制作报价单模板图片,小松挖机官方网站报价?
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
网站建设整体流程解析,建站其实很容易!
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
Laravel如何使用Vite进行前端资源打包?(配置示例)
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
Python结构化数据采集_字段抽取解析【教程】
Angular 表单中正确绑定输入值以确保提交与验证正常工作
如何用PHP快速搭建CMS系统?
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
LinuxShell函数封装方法_脚本复用设计思路【教程】
如何彻底卸载建站之星软件?
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
Python文件异常处理策略_健壮性说明【指导】
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
利用vue写todolist单页应用
微信小程序 canvas开发实例及注意事项
实现点击下箭头变上箭头来回切换的两种方法【推荐】
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
如何构建满足综合性能需求的优质建站方案?
linux top下的 minerd 木马清除方法
香港服务器WordPress建站指南:SEO优化与高效部署策略
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
如何用免费手机建站系统零基础打造专业网站?
如何生成腾讯云建站专用兑换码?

