Web 前端性能优化之七:数据存储与缓存技术

news2025/2/26 23:49:49

7、数据存储

在开发Web应用的过程中,会涉及一些数据的存储需求,常见的存储方式可能有:

保存登录态的Cookie;

使用浏览器本地存储进行保存的Local Storage和Session Storage;

客户端数据持久化存储方案涉及的Web SQL和IndexedDB;

直接存储在本机的文件系统上等。

文件系统、WebSQL和IndexedDB都是异步方式,

而本地存储的Local Storage和Session Storage方式则是同步方式。

在这里插入图片描述

各种存储方式的不同维度

在这里插入图片描述

Cookies、Web SQL 等面板信息

Cache Storage是一种为缓存网络请求与响应而设计的数据存储机制,这些请求与响应可以是在应用程序运行过程中常规创建的,也可以是专门为了在缓存中存储一些数据而创建的。

IndexedDB 的实践

当浏览的网站页面被加载出来时,首先需要向服务器请求相应数据来构造页面显示的状态信息,然后再利用这些信息完成页面渲染,如果能将首次请求的信息保存到IndexedDB中,则能有效减少一些频繁访问页面的加载时间。

1、注意平台兼容性:使用 ArrayBuffer 存储(更兼容)

Blob类型比ArrayBuffer类型多了一个MIME类型的字段,为了能够正确地进行数据类型转化,将ArrayBuffer类型转化为Blob类型时需将该类型字段也加入缓冲区。代码示例如下:

在这里插入图片描述

将Blob类型转化为ArrayBuffer类型的过程会稍复杂一些,需要通过异步方式使用FileReader对象以ArrayBuffer格式读取Blob对象,然后在读取完成所触发的loadend事件中处理转化结果。代码示例如下:

在这里插入图片描述

2、完善错误处理

在进行数据存储时,会因为很多原因造成数据的读写失败,并且数据存储在某些情况下是不可控的。

由于IndexedDB的主要操作方法都集中在IDBDatabase、IDBTransaction和IDBRequest接口对象上,所以可为它们添加error监听事件,然后根据报错信息进行恰当的错误处理。以监听打开或创建IndexedDB的操作情况为例,代码如下:

在这里插入图片描述

3、注意修改、删除和过期

针对历史版本进行相应的升级处理,可以使用IDBOpenDBRequest.onupgradeneeded()方法来捕获IndexedDB版本升级事件,具体代码示例如下:

在这里插入图片描述

4、存储性能

虽然操作IndexedDB的API均是异步执行的,但不正确的使用方式依然会带来存储的性能风险,可能阻塞主线程造成应用崩溃或无响应。

产生风险的主要原因是IndexedDB在存储数据对象时,需要首先创建该数据对象的一个结构化副本,而这个复制过程是在主线程中进行的,所以数据对象嵌套的越复杂、规模越大,对主线程的阻塞时间就会越长。因此在操作IndexedDB时可参考这条规则:读写数据的大小不应该大于待访问的数据大小。

对规模较大的状态数据进行频繁改动时,也会给主线程的执行带来很大压力,即便采用了防抖和节流,也可能阻塞主线程的执行,增加数据写入出错的风险。**因此可采取的优化方式是:将原本整个状态对象的存储方式分解为粒度更小的单个状态记录进行存储。**这样可在进行状态更新时,仅更新实际发生修改的状态记录,而不会引起整个应用的状态对象进行大规模的数据存储。

8、缓存技术

缓存的原理是在首次请求后保存一份请求资源的响应副本,当用户再次发起相同请求后,如果判断缓存命中则拦截请求,将之前存储的响应副本返回给用户,从而避免重新向服务器发起资源请求。

缓存的技术种类有很多,比如代理缓存、浏览器缓存、网关缓存、负载均衡器及内容分发网络等,

它们大致可以分为两类:共享缓存和私有缓存。

共享缓存指的是缓存内容可被多个用户使用,如公司内部架设的Web代理;

私有缓存指的是只能单独被用户使用的缓存,如浏览器缓存。

HTTP缓存应该算是前端开发中最常接触的缓存机制之一,它又可细分为强制缓存与协商缓存,二者最大的区别在于判断缓存命中时,浏览器是否需要向服务器端进行询问以协商缓存的相关信息,进而判断是否需要就响应内容进行重新请求。

1、Service Worker

Service Worker是浏览器后台独立于主线程之外的工作线程,正因如此它的处理能力能够脱离浏览器窗体而不影响页面的渲染性能。

Service Worker是伴随着Google推出的PWA(即Progressive Web App渐进式Web应用)一同出现的技术,它能够实现诸如消息推送、后台加载、离线应用及移动端添加到主屏等堪比原生应用的功能,同时还具备小程序“无须安装、用完即走”的体验特点。虽然Service Worker已被列入W3C标准,但在各端上的兼容性并不理想,目前来讲应用比较多的还是在基于Chrome的PC端浏览器上。(最新的兼容性可以查看相应网站)

1、技术由来

JavaScript的执行是单线程的,如果一个任务的执行占用并消耗了许多计算资源,则势必会导致阻塞执行其他任务,这正是单线程的弊端。

为此浏览器引入了Web Worker,它是一个独立于浏览器主线程之外的工作线程,可以将较复杂的运算交给它来处理,而无须担心这是否会对页面渲染产生负面影响。

Service Worker正是在此基础上增加了对离线缓存的管理能力,它的表现弥补了之前HTML 5上采用AppCache实现离线缓存的诸多缺陷。

Service Worker定义了由事件驱动的生命周期,这使得页面上任何网络请求事件都可以被其拦截并加以处理,同时还能访问缓存和IndexedDB,这就可以让开发者制定自定义度更高的缓存管理策略,从而提高离线弱网环境下的Web运行体验。

2、基本特征

●独立于浏览器主线程,无法直接操作DOM。

●在开发过程中可以通过localhost使用,但要部署到线上环境则需要HTTPS的支持。

●能够监听并拦截全站的网络请求,从而进行自定义请求响应控制。

●在不使用的时候会被中止,在需要的时候进行重启。所以我们不能依赖在其onmessage与onfetch的事件监听处理程序中的全局状态,如果有此需要可以通过访问IndexedDB API将全局状态进行存储。

●广泛使用Promise来处理异步。

●消息推送。

●后台同步。

2、Push 缓存

HTTP 2新增了一个强大的功能:服务器端推送,它的出现打破了传统意义上的请求与响应一对一的模式,服务器可以对客户端浏览器的一个请求发送多个响应。

这样会带来性能优化的一个新思路:在传统的网络应用中,客户端若想将应用中所包含的多种资源渲染展示在浏览器中,就需要逐个资源进行请求,但其实一个HTML文件中所包含的JavaScript、样式表及图片等文件资源,是服务器可以在收到该HTML请求后预判出稍后会到来的请求,那么就可以利用服务器端推送节省这些多余的资源请求,来提升页面加载的速度。

1、最后一道缓存

浏览器缓存通常可以分为四个方面:内存中的缓存、Service Worker缓存、HTTP缓存及HTTP 2的Push缓存。

1、内存中的缓存

内存中的缓存是浏览器中响应速度最快且命中优先级最高的一种缓存,但它的驻留周期非常短,通常依赖于渲染进程,一旦页面页签关闭进程结束,内存中的缓存数据就会被回收。

2、缓存命中优先级

浏览器缓存的命中优先级从高到低分别是:内存中的缓存、Service Worker缓存、HTTP缓存及HTTP 2的Push缓存。

在这里插入图片描述

缓存命中优先级

3、基于连接的缓存

在了解了缓存命中优先级后,我们还需要明白Push缓存是依赖于HTTP 2连接的,如果连接断开,即便推送的资源具有较高的可缓存性,它们也会丢失,这就意味着需要建立新的连接并重新下载资源。考虑到网络可能存在不稳定性,建议不要长时间依赖Push缓存中的资源内容,它更擅长的是资源推送到页面提取间隔时长较短的使用场景。

4、预加载 与 Push 缓存

Push缓存和预加载还存在一些不同之处,其中主要的不同点是,Push缓存是由服务器端决定何时向客户端预先推送资源的,而预加载则是当客户端浏览器收到HTML文件后,经过解析其中带有preload的标签,才会开启预加载的。

为了方便决定使用Push缓存还是预加载,下面给出一个决策树以供参考:

在这里插入图片描述

3、CDN 缓存

CDN全称Content Delivery Network,即内容分发网络,它是构建在现有网络基础上的虚拟智能网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、调度及内容分发等功能模块,使用户在请求所需访问的内容时能够就近获取,以此来降低网络拥塞,提高资源对用户的响应速度。

在这里插入图片描述

使用 CDN 加速的网络

与前端关系密切的CDN优化点:域名设置。

Cookie的访问遵循同源策略,并且同一域名下的所有请求都会携带全部Cookie信息。若这些完全没有必要的开销积少成多,那么它们所产生的流量浪费就会很大,所以将CDN服务器的域名和主站域名进行区分是非常有价值的实践。

因为浏览器对于同域名下的并发请求存在限制,通常Chrome的并发限制数是6,其他浏览器可能多少会有所差异。这种限制也同时为我们提供了一种解决方案:通过增加类似域名的方式来提高并发请求数,比如对多个图片文件进行并发请求的场景,可以通过扩展如下类似域名的方式来规避限制:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1585409.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis Cluster集群模式

目录 一、理论 1.1 概念 1.2 集群的作用 1.3 redis集群的数据分片 1.4 Redis集群的主从复制模型 二、实践 2.1 Redis集群模式的搭建 2.1.1 cluster集群前期工作 2.1.2 开启群集功能 2.1.3 启动redis节点 2.1.4 启动集群 2.2 测试集群 总结 一、理论 1.1 概念 集群&a…

pyside6的QSpinBox自定义特性初步研究(二)

当前的需求是,蓝色背景的画面,需要一个相对应色系的QSpinBox部件。已有的部件风格是这样的,需要新的部件与之般配。 首先新建一个QDoubleSpinBox,并定义其背景色和边框: QDoubleSpinBox { color: white; border:1px…

光学雨量计红外雨量传感器应用于小型气象站

光学雨量计红外雨量传感器应用于小型气象站 随着气候变化对人类生活和农业生产的影响越来越大,气象观测设备的需求也逐渐增加。其中一种常见的气象观测设备是雨量计,用于监测降水量。在小型气象站中,光学雨量计红外雨量传感器被广泛应用。 …

数据库知识点汇总(最全!,2024年最新大佬分享开发经验

十九、删除数据 DELETE 语句 使用 DELETE 语句从表中删除数据。 DELETE FROM table [WHERE condition]; 删除数据 使用 WHERE 子句删除指定的记录 DELETE FROM departments WHERE department_name ‘Finance’; 如果省略 WHERE 子句,则表中的全部数据将被删除 DELE…

ai智能问答免费API接口

智能对话API接口,可以为网站或其他产品提供强大的智能交互功能,无需自行开发复杂的语义分析和自然语言处理算法。这使得开发者能够更专注于产品的核心功能和用户体验,加速产品上线速度并降低开发成本。 智能对话API接口的功能还包括对话内容…

CentOS安装MeterSphere并实现无公网IP远程访问本地测试平台

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

VS运行.netcore项目,一般情况下都是用localhost访问,怎么做到用IP地址访问,步骤详解

一、问题描述 通常情况下运行起来都是这样 运行后效果 怎么做到下面这样呢? 二、解决办法 vs把项目运行起来之后,在电脑的右下角有一个图标,右键它 点击其中一个 进入applicationhost.config文件

Golang | Leetcode Golang题解之第14题最长公共前缀

题目&#xff1a; 题解&#xff1a; func longestCommonPrefix(strs []string) string {if len(strs) 0 {return ""}isCommonPrefix : func(length int) bool {str0, count : strs[0][:length], len(strs)for i : 1; i < count; i {if strs[i][:length] ! str0 …

用树莓派监测地震?

监测人类活动和地质活动对地球的影响是 Raspberry Shake 在全球取得的一项成功。 Raspberry Shake 的目标是建立一个让公民科学家也能使用的专业级地震仪。现在&#xff0c;他们在全球安装了数千台基于 Raspberry Pi 的高灵敏度仪器&#xff0c;为前沿研究提供动力。 解决方案…

Facial Micro-Expression Recognition Based on DeepLocal-Holistic Network 阅读笔记

中科院王老师团队的工作&#xff0c;用于做微表情识别。 摘要&#xff1a; Toimprove the efficiency of micro-expression feature extraction,inspired by the psychological studyof attentional resource allocation for micro-expression cognition,we propose a deep loc…

IDEA中无法保存设置 Cannot Save Settings

确定原因: 在IDEA中父工程不应该存在有子工程的相关东西 首先,这是我的DCYJ项目(观察右侧的Content Root) 其次,这是我的EAPOFode项目(观察右侧的Content Root爆红处) 最后我将DCYJ项目右侧的Content Root全部删掉

Java毕业设计 基于springboot vue撸宠平台 宠物系统

Java毕业设计 基于springboot vue撸宠平台 宠物系统 springboot撸宠平台 宠物系统 功能介绍 首页 图片轮播 用户或商家注册 用户或商家登录 登录验证码 店铺信息 店铺详情 店铺投诉 宠物信息 宠物详情 预订 退订 搜索 收藏 点赞 踩 评论 个人中心 更新信息 我的收藏 在线客服…

【NLP】隐马尔可夫模型(HMM)与条件随机场(CRF)简介

一. HMM 隐马尔可夫模型&#xff08;Hidden Markov Model, HMM&#xff09;是一种用于处理含有隐藏状态的序列数据的统计学习模型。通过建模隐藏状态之间的转移关系以及隐藏状态与观测数据的生成关系&#xff0c;HMM能够在仅观察到部分信息的情况下进行状态推理、概率计算、序…

Spring Boot项目获取resources目录下的文件并返回给前端

学无止境&#xff0c;气有浩然&#xff01; 新开通公众号&#xff0c;欢迎大家关注&#xff0c;后续会持续分享技术和相关资料 文章目录 前言方案1.getResourceAsStream2.ResourceLoader3.Value配合Resource 打完收工&#xff01; 前言 最近项目需要下载一个模板文件用来修改…

32.768khz晶振时间跑不准有偏差的原因

32.768kHz晶振是一种常见的晶振频率&#xff0c;广泛应用于实时钟电路、计时电路和低功耗设备中。然而&#xff0c;有时候会发现32.768kHz晶振的时间跑不准&#xff0c;存在一定的偏差。JF晶发电子将介绍几个可能导致32.768kHz晶振时间跑不准的原因。 1. 温度变化&#xff1a;…

vue3页面导出为PDF文件

vue3页面导出为PDF文件 尝试了很多方法&#xff0c;都没有找到完美的解决方法 目前网上有个思路&#xff0c;就是将页面先转存为图片&#xff0c;然后将图片另存为PDF文件 记录一下完整过程 一、安装必备包 安装两个第三方插件 npm i html2canvas npm i jspdfhtml2canvas…

八股面试——数据库——索引

索引的概念 B树的概念&#xff1a; 索引的作用 聚簇索引与非聚簇索引 聚簇索引就是主键值&#xff0c;在B树上&#xff0c;通过主键大小&#xff08;数据在B树叶子节点按主键顺序排序&#xff09;寻找对应的叶子节点&#xff0c;叶子节点保存的一整条记录。 非聚簇索引&#x…

【vim 学习系列文章 22 -- vim 实现 linux 多行快速标准注释】

文章目录 vim 实现 linux 多行快速标准注释 vim 实现 linux 多行快速标准注释 不多说了&#xff0c;直接上动图&#xff1a; 上代码&#xff1a; function! CommentBlock()" 获取Visual模式选中的起始和结束行号let old_start_line line("<")let old_end…

项目4-图书管理系统2+统一功能处理

1. 拦截器&#xff08;Interceptor&#xff09; 我们完成了强制登录的功能, 后端程序根据Session来判断用户是否登录, 但是实现⽅法是比较麻烦的。 所需要处理的内容&#xff1a; • 需要修改每个接⼝的处理逻辑 • 需要修改每个接⼝的返回结果 • 接⼝定义修改, 前端代码也需…