前端性能优化——缓存优化

news2024/11/26 18:38:36

前端性能优化可以从多个方面下手,例如加载性能优化、渲染性能优化、代码优化、缓存优化、性能监测和优化等方面下手,下面针对缓存优化分享一下优化思路。

        浏览器缓存主要分为强缓存和协商缓存。强缓存命中时,浏览器直接从本地缓存中获取资源,无需向服务器发送请求;协商缓存则在资源过期后,向服务器发送请求询问资源是否有更新,若未更新则使用本地缓存。

一、利用强缓存

1.设置HTTP缓存头

        通过设置Cache-ControlExpires响应头来控制资源的缓存时间。

        Cache-Control可以设置多种指令,如max-age=31536000表示资源在 31536000 秒(一年)内有效,可以被缓存。

        Expires指定一个绝对时间,如Expires: Thu, 31 Dec 2024 23:59:59 GMT,表示在这个时间之前资源可以被缓存。

2.区分静态资源和动态资源

        对于静态资源如图片、CSS、JavaScript 文件等,可以设置较长时间的强缓存。因为这些资源一般不会频繁变动,设置长时间缓存可以减少网络请求,提高页面加载速度。

        动态资源如根据用户请求生成的页面内容,通常不适合设置强缓存,可以设置较短的缓存时间或者不设置强缓存,以确保用户每次请求都能获取到最新的内容。

二、利用协商缓存

1.设置ETagLast-Modified

        服务器可以在响应头中设置Last-Modified,表示资源的最后修改时间。浏览器再次请求资源时,会在请求头中带上If-Modified-Since,值为上次服务器返回的Last-Modified时间。服务器对比资源的实际修改时间和这个时间,如果没有变化,则返回 304 状态码,告知浏览器使用本地缓存。

        ETag是服务器生成的资源唯一标识,可以是资源的哈希值等。浏览器请求资源时,在请求头中带上If-None-Match,值为上次服务器返回的ETag。服务器对比资源的当前ETag和请求中的If-None-Match,如果一致则返回 304 状态码。

2.合理选择ETagLast-Modified费

        如果资源的修改频率较低且内容不易发生变化,可以优先使用Last-Modified,因为它的计算成本相对较低。

        对于频繁修改但内容变化不大的资源,可以考虑使用ETag,因为它可以更准确地判断资源是否发生变化。例如,一个文本文件可能经常被修改,但内容的变化可能只是一些小的调整,使用ETag可以更精确地判断是否需要重新传输资源。

三、Service Worker 缓存

1.注册 Service Worker

        Service Worker 是在浏览器后台运行的脚本,可以拦截和处理网络请求,实现离线缓存等功能。

        在页面中通过navigator.serviceWorker.register('service-worker.js')注册 Service Worker 脚本。

2.缓存策略制定

        在 Service Worker 脚本中,可以使用caches.open()打开缓存空间,然后使用cache.addAll()fetch()结合cache.put()等方法将资源添加到缓存中。

        例如,可以在 Service Worker 的install事件中缓存关键的静态资源:

     self.addEventListener('install', event => {
       event.waitUntil(
         caches.open('my-cache').then(cache => {
           return cache.addAll([
             '/',
             '/index.html',
             '/styles.css',
             '/script.js'
           ]);
         })
       );
     });

3.拦截请求并返回缓存资源

        在 Service Worker 的fetch事件中,可以拦截网络请求,先检查缓存中是否有对应的资源,如果有则直接返回缓存资源,否则发起网络请求并将响应添加到缓存中。

        例如:

     self.addEventListener('fetch', event => {
       event.respondWith(
         caches.match(event.request).then(response => {
           if (response) {
             return response;
           }
           return fetch(event.request).then(response => {
             const clonedResponse = response.clone();
             caches.open('my-cache').then(cache => {
               cache.put(event.request, clonedResponse);
             });
             return response;
           });
         })
       );
     });

四、内存缓存与本地存储缓存的结合

1. 内存缓存的运用

        对于一些频繁使用且体积较小的资源,可以考虑在内存中进行缓存。例如,使用 JavaScript 的变量或对象来存储一些常用的数据或小型图片的 base64 编码。

        优点是访问速度极快,可以在瞬间获取到缓存的数据。但由于内存空间有限,不适合存储大量数据或大型资源。

2.本地存储缓存

        localStoragesessionStorage可以用来存储一些数据,以便在页面刷新或重新加载时使用。例如,可以将一些用户设置、表单数据等存储在本地存储中,避免用户重复输入。

        但要注意存储的数据量不宜过大,以免影响浏览器性能。同时,要注意数据的安全性和隐私性,避免存储敏感信息。

五、缓存更新策略

1.版本控制

        对于静态资源,可以通过在文件名中添加版本号或哈希值来强制浏览器更新缓存。例如,将styles.css改为styles-v1.2.cssstyles.abc123.css,当资源内容发生变化时,更新版本号或哈希值,浏览器会认为这是一个新的资源,从而下载新的资源并更新缓存。

2.后台更新缓存

        可以在服务器端设置定时任务或通过事件触发,检查资源的变化情况,并更新缓存。例如,当服务器上的静态资源发生变化时,服务器可以自动更新缓存中的资源,以便下次用户请求时能够获取到最新的资源。

3.手动清除缓存

        在开发过程中,为了确保能够及时看到最新的代码变化,可以手动清除浏览器缓存。不同浏览器有不同的清除缓存方法,一般可以在浏览器的设置中找到清除缓存的选项。

六、监控与分析缓存效果

1.使用浏览器开发者工具

        可以使用浏览器的开发者工具来查看资源的缓存情况,包括强缓存和协商缓存的状态、缓存时间等。在 “Network” 面板中,可以查看每个资源的请求和响应信息,了解资源是否从缓存中获取以及缓存的命中情况。

2.性能监测工具

        使用性能监测工具如 Google PageSpeed Insights、WebPageTest 等,可以分析页面的加载性能,包括缓存的使用情况。这些工具会给出具体的优化建议,帮助你进一步优化缓存策略。

3.自定义日志记录

        在前端代码中,可以添加自定义的日志记录,记录资源的加载情况、缓存的命中情况等。通过分析这些日志,可以了解缓存的使用效果,发现潜在的问题并进行优化。

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

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

相关文章

Unity3D包管理bug某些版本Fbx Exporter插件无法搜索到的问题

这个问题是在使用unity的时候发现的 有些版本里没有Fbx Exporter插件也是没法搜到 经过测试,在package manager中开启Enable Preview Packages也没有用 这个插件在2020已经是正式版了,不需要再开启 后来发现可能是版本bug 需要手动开启 在工程的Pac…

03.DDD六边形架构

学习视频来源:DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 什么是依赖DDD四层架构六边形架构代码实现 想要详细了解六边形架构,可以看我之前的一篇文章。是对六边形架构原文的翻…

Android启动流程_Zygote阶段

前言 上一篇文档中我们描述了 Android 启动中的 init 启动部分,本片文档将会继续 Android 启动流程的逻辑,继续梳理 Zygote 部分功能。 说明框架 对于 Zygote 进程,要从以下框架说明: 第一点,编译,zygo…

最新AI软件部署,ChatGPT商业AI系统源码,支持GPT4.0+AI换脸+AI智能体GPTs应用+AI绘画+AI视频+文档分析

一、前言 SparkAi创作系统是一款基于ChatGPT和Midjourney开发的智能问答和绘画系统,提供一站式 AI B/C 端解决方案,AI大模型提问、AI绘画、专业版AI视频生成、文档分析、多模态识图理解、TTS & 语音识别对话、AI换脸、支持AI智能体应用(…

C++ | Leetcode C++题解之第514题自由之路

题目&#xff1a; 题解&#xff1a; class Solution { public:int findRotateSteps(string ring, string key) {int n ring.size(), m key.size();vector<int> pos[26];for (int i 0; i < n; i) {pos[ring[i] - a].push_back(i);}vector<vector<int>>…

联想笔记本电脑睡眠后打开黑屏解决方法

下载联想机器睡眠无法唤醒修复工具 下载地址&#xff1a;https://tools.lenovo.com.cn/exeTools/detail/id/233/rid/6182522.html 使用完后重启电脑&#xff0c;问题解决。

应用案例 | Panorama SCADA助力巴黎奥运会:保障赛事协调与安全

谈到2024年最受关注的体育盛事&#xff0c;巴黎奥运会无疑是焦点之一。作为全球瞩目的顶级赛事&#xff0c;它不仅汇集了来自世界各地的精英运动员&#xff0c;还点燃了全球观众的热情。然而&#xff0c;组织如此大规模的活动绝非易事。从大量游客通过公共交通涌入&#xff0c;…

Flux-IP-Adapter-V2版本发布,效果实测!是惊喜还是意外?

更多AI教程&#xff1a;AI教程_深度学习入门指南 - 站长素材 简介 XLAB团队发布了FLUX.1-dev模型的最新IP-Adapter V2版本。这是在之前IP-Adapter V1版本上的进一步升级。新版本的IP-Adapter模型在保持图像纵横比的同时&#xff0c;分别在512x512分辨率下训练了150k步&#x…

【计算机网络教程】课程 章节测试1 计算机网络概述

一. 单选题&#xff08;共16题&#xff09; 1 【单选题】以下关于TCP/IP参考模型缺点的描述中&#xff0c;错误的是&#xff08; &#xff09;。 A、在服务、接口与协议的区别上不很清楚 B、网络接口层本身并不是实际的一层 C、它不能区分数据链路和物理层 D、传输层对…

超出人类思维的「系统0」:AI正在创造一种新的思维方式吗?

在大众的认知中&#xff0c;人类的思维分为系统 1&#xff08;System 1&#xff0c;直觉的、快速的、无意识的、自动思考&#xff09;和系统 2&#xff08;System 2&#xff0c;有逻辑的、缓慢的、有意识的、计划和推理&#xff09;。 如今&#xff0c;一种不同于 System 1 和…

袋鼠云秋季发布会圆满落幕,AI驱动让生产力数智化

在当今时代&#xff0c;AI 的发展如汹涌浪潮&#xff0c;其速度之快超越了任何历史时期。它以前所未有的迅猛之势&#xff0c;渗入到各个领域的不同场景之中&#xff0c;悄然重塑着商业模式与人们的生活方式。 在 AI 逐渐成为企业基础属性的背景下&#xff0c;袋鼠云举办秋季发…

linux 高级 I/O

高级 I/O 1. 阻塞 I/O 与非阻塞 I/O2. 阻塞 I/O 所带来的困境3. 何为 I/O 多路复用以及原理select()函数介绍poll()函数介绍总结 4. 何为异步 I/O 以及原理5. 存储映射 I/O7. 文件加锁 1. 阻塞 I/O 与非阻塞 I/O 这里举个例子&#xff0c;譬如对于某些文件类型&#xff08;读管…

centos7配置keepalive+lvs

拓扑图 用户访问www.abc.com解析到10.4.7.8&#xff0c;防火墙做DNAT将访问10.4.7.8:80的请求转换到VIP 172.16.10.7:80&#xff0c;负载均衡器再将请求转发到后端web服务器。 实验环境 VIP&#xff1a;负载均衡服务器的虚拟ip地址 LB &#xff1a;负载均衡服务器 realserv…

【亚马逊云科技】Amazon Bedrock搭建AI服务

前言 大模型应用发展迅速&#xff0c;部署一套AI应用的需求也越来越多&#xff0c;从头部署花费时间太长&#xff0c;然而亚马逊科技全托管式生成式 AI 服务 Amazon Bedrock&#xff0c;Amazon Bedrock 简化了从基础模型到生成式AI应用构建的复杂流程&#xff0c;为客户铺设了…

「C/C++」C/C++ 之 判断语句

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

git快速合并代码dev->master

需求&#xff1a; 日常开发都是在dev分支进行开发&#xff0c;但是dev代码开发测试完成后&#xff0c;需要将dev代码合到master主分支上 开始合并代码&#xff1a; 一、场景 一个代码仓库&#xff0c;包含两个分支&#xff0c;一个是master&#xff0c;另一个是dev&#xff1b…

uniapp使用uni-push模拟推送

uniapp使用uni-push模拟推送 第一步先去uniapp开发者中心添加开通uni-push功能 这里的Android 应用签名可以先用测试的官网有,可以先用这个测试 官方测试链接文档地址 在项目中的配置文件勾选 组件中使用 如果要实时可以去做全局ws //消息推送模版uni.createPushMessage(…

前沿技术与未来发展第一节:C++与机器学习

第六章&#xff1a;前沿技术与未来发展 第一节&#xff1a;C与机器学习 1. C在机器学习中的应用场景 C在机器学习中的应用优势主要体现在高效的内存管理、强大的计算能力和接近底层硬件的灵活性等方面。以下是 C 在机器学习领域的几个主要应用场景&#xff1a; 1.1 深度学习…

Java程序设计:spring boot(10)——单元测试

1 pom.xml 测试依赖添加 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId> </dependency> 2 Service业务方法测试 以 UserService 为例&#xff0c;src/test/java ⽬录下添…

解决edge浏览器无法同步问题

有时候电脑没带&#xff0c;但是浏览器没有同步很烦恼。chrome浏览器的同步很及时在多设备之间能很好使用。但是edge浏览器同步没反应。 在这里插入图片描述 解决方法&#xff1a; 一、进入edge浏览器点击图像会显示未同步。点击“管理个人资料”&#xff0c;进入后点击同步&…