【性能优化】前端实际项目中的缓存应用

缓存是什么?

缓存是一种保存资源副本的技术,这样当用户再次访问网站时,可以直接从缓存中获取资源,而不是从服务器重新下载。这就像是我们看过的电影,如果记得剧情就不用再看一遍一样。

基本的缓存类型

  • 浏览器缓存:就是在你的电脑或手机上保存网站信息。下次访问时,网站会快很多因为它可以直接使用这些保存的信息。
  • CDN缓存:CDN是一群分布在不同地方的服务器,它们可以存储网站内容。当用户访问网站时,最近的服务器会响应请求,因此加载速度更快
  • 服务端缓存:是在网站服务器上直接保存数据,这样当有人请求相同的数据时,服务器可以快速响应,而不需要再次处理相同的请求。

实际使用场景

在实际的工作中,使用缓存技术可以在多种场景下显著提升应用的性能和用户体验。以下是一些具体的实例,展示了在不同情况下如何利用缓存:

1. 提升网站加载速度

场景:一个新闻网站,用户经常访问以查看最新文章。
缓存应用:通过浏览器缓存静态资源(如CSS、JavaScript文件和图片)和使用Service Workers缓存文章内容,即使在网络条件不佳的情况下,用户也可以快速加载网站和之前浏览过的文章。

2. 减轻服务器压力

场景:电商平台在大促销期间访问量激增。
缓存应用:利用CDN缓存来分散请求压力,静态内容(如商品图片、描述页面)通过CDN提供,减少对原始服务器的直接请求,从而提升响应速度并减轻服务器压力。

3. 数据库查询优化

场景:社交网络应用,用户频繁查看其他用户的个人资料。
缓存应用:使用内存缓存机制(如Redis)来缓存热门用户的资料。当有请求查询用户资料时,先检查缓存中是否有数据,有则直接返回,无则从数据库查询并更新到缓存中。这样可以减少数据库的查询压力和延迟。

4. 用户会话管理

场景:需要保持用户登录状态的应用。
缓存应用:将用户会话(Session)数据存储在缓存中,而不是每次都查询数据库。这样可以快速检索用户状态,同时确保应用的可扩展性和响应速度。

5. 动态内容的个性化缓存

场景:新闻推荐系统,根据用户的阅读历史和偏好推荐相关内容。
缓存应用:对于用户的个性化推荐结果进行边缘缓存,尽管内容是动态生成的,但对于相似偏好的用户群体,可以共享缓存的推荐结果,减少计算资源消耗。

6. API响应缓存

场景:为第三方消费者提供的天气信息API,其中大部分请求都是查询相同地点的天气。
缓存应用:对API响应结果进行缓存,当收到对同一地点的查询请求时,可以直接从缓存返回结果,而不是每次都进行复杂的数据处理和查询。这样可以加快响应速度,提高API的吞吐量。

7. 离线应用支持

场景:移动应用,需要在没有网络连接时仍能提供核心功能。
缓存应用:通过Service Workers预缓存关键资源和数据,使得应用在离线时还能提供基本的浏览和功能体验,如阅读预先下载的文章或查看地图信息。

在这些场景中,缓存技术不仅提高了性能和响应速度,还优化了资源利用,增强了用户体验。正确实施缓存策略对于开发高效、可靠的Web和移动应用至关重要。

如何在Vue和React项目中使用缓存

Vue项目

1. 使用Webpack配置强缓存
// webpack.config.js
module.exports = {output: {filename: '[name].[contenthash].js', // 用文件内容的哈希值命名文件,内容改变,文件名也会改变publicPath: '/' // 确定资源的基础路径}
};

为什么这么做? 当你的文件内容改变,文件名也会改变。浏览器会认为这是一个全新的文件,从而下载新文件,而不是使用旧的缓存。

2. 使用Vue的<keep-alive>标签缓存组件
<keep-alive><YourComponent v-if="$route.meta.keepAlive" />
</keep-alive>

场景示例:假设你有一个商品列表页面,当用户点击一个商品查看详情后再返回列表时,我们不想再次加载整个列表。使用<keep-alive>就可以让列表保持之前的状态,不需要重新加载。

3.在Vue项目中集成Service Workers

Vue CLI提供了一个现成的PWA(Progressive Web App)插件,该插件简化了Service Worker的集成和配置过程。如果你的Vue项目是通过Vue CLI创建的,你可以通过以下步骤添加PWA支持:

  1. 添加PWA插件:运行以下命令来安装Vue CLI的PWA插件。

    vue add pwa
    

    这个命令会自动安装需要的依赖,并生成一个默认的Service Worker文件。

  2. 配置Service Worker:插件安装完成后,你可以在src/registerServiceWorker.js中看到Service Worker的注册逻辑,以及在vue.config.js中进行PWA的配置。你可以根据需要调整这些配置。

  3. 自定义Service Worker:对于更高级的用例,你可能需要自定义Service Worker的行为。Vue CLI的PWA插件使用了Workbox来简化Service Worker的配置和部署。你可以在项目的public目录中创建一个自定义的Service Worker文件,并通过Workbox或手动编写代码来定义缓存策略和处理网络请求。

总结

Service Workers是一项强大的技术,可以显著提升Web应用的性能和用户体验。无论是在React还是Vue项目中,都可以利用Service Workers来实现离线功能、资源缓存、后台同步和推送通知。通过合理地使用Service Workers,你可以构建更加快速、可靠和交互式的Web应用。

React项目

1. 使用Service Workers缓存资源

Service Workers是一种运行在浏览器背后的脚本,它可以帮助你缓存资源,让应用即使在离线时也能访问某些资源。

if ('serviceWorker' in navigator) {window.addEventListener('load', function() {navigator.serviceWorker.register('/service-worker.js').then(function(registration) {// 注册成功console.log('ServiceWorker registration successful with scope: ', registration.scope);}, function(err) {// 注册失败:(console.log('ServiceWorker registration failed: ', err);});});
}

场景示例:假如你的网站是一个新闻应用,用户在早上浏览了一些新闻。即使后来没有网络,用户仍然可以打开应用,阅读早上加载过的新闻内容。

通用策略:合理设置HTTP缓存头(后端搞,但是咱们得知道)

无论是Vue还是React项目,正确设置HTTP缓存头都非常重要。这是告诉浏览器何时应该从服务器请求新的资源,何时可以使用缓存的资源。

Cache-Control: max-age=3600

这行代码的意思是,资源可以在本地缓存,并且在3600秒(即1小时)内都是有效的。这样,如果用户在这1小时内再次访问同一个资源,浏览器就会直接从缓存中加载,加快加载速度。

监控和优化缓存策略

实施了缓存之后,我们还需要监控和调整缓存策略,以确保它们达到最佳效果。可以使用一些工具,比如Google Chrome的开发者工具中的Network面板,来查看资源是否被缓存。

如果发现缓存不如预期工作,可能需要调整缓存的持续时间,或者在发布新版本的应用时,确保更新了资源文件的名字(特别是当使用了内容哈希命名策略时)。

常见问题及解决方案

缓存版本控制

问题:当你更新了网站上的一个文件,比如一张图片或一个CSS文件,但用户的设备上还是显示旧的版本。

解决方案:使用版本控制技巧,如在文件名中加入版本号或内容哈希值。这样,每当文件被修改时,其URL也会改变,浏览器就会重新加载新的文件。

用户看到的是缓存的旧页面

问题:你更新了网站,但用户反馈他们看到的还是旧的页面。

解决方案:确保服务端设置的缓存策略合理,对于经常变动的内容,设置较短的缓存时间或使用协商缓存。此外,可以通过Service Workers来管理资源的缓存策略,确保用户能够获取到最新的内容。

结语

缓存是提高网站性能的有效手段,合理利用缓存可以显著加快网站的加载速度,改善用户体验。不过,缓存策略需要根据实际情况灵活调整,过度缓存可能会导致用户看到过时的内容。希望通过这篇文章,你能对缓存有一个基本的了解,并在你的Vue或React项目中实施合适的缓存策略。

记住,优化网站性能是一个持续的过程,不断测试和调整缓存策略,以确保用户可以享受到快速而流畅的访问体验

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

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

相关文章

Polar 写shell

Polar 写shell 直接给了源码 还是没啥好说的&#xff0c;考点是die()死亡函数绕过之不同变量 **绕过原理&#xff1a; **通过base64解密或rot13解密使"<?php exit();"变为乱码&#xff0c;而传入的$content为base64编码&#xff0c;解码后为正常shell语句。通过…

自封装 bind 方法(一)

因为 bind 的使用方法是 某函数.bind(某对象&#xff0c;...剩余参数) 所以需要在 Function.prototype 上进行编程将传递的参数中的某对象和剩余参数使用 apply 的方式在一个回调函数中执行即可要在第一层获取到被绑定函数的 this&#xff0c;因为要拿到那个函数用 apply /***…

Java面试篇【并发编程】常见面试题(2024最新)

Java并发编程常见面试题 1.什么是线程和进程&#xff1f; 进程是操作系统分配资源的最小单位&#xff0c;各个进程之间占据独立的寻址空间&#xff0c;运行也是独立运行&#xff0c;进程间通信需要一些机制。进程间切换需要的开销较大。 线程是程序执行的基本单位&#xff0c…

聊一聊ThreadLocal的原理?

1.ThreadLocal创建方式 ThreadLocal<String> threadlocal1 new ThreadLocal(); ThreadLocal<String> threadlocal2 new ThreadLocal(); ThreadLocal<String> threadlocal3 new ThreadLocal(); 2.首先介绍一下&#xff0c;ThreadLocal的原理&#xff1a; 如…

使用Python监测网络连接和网速

大家好&#xff0c;网络连接和网速在工作中非常重要&#xff0c;本文将介绍如何使用Python程序来监测互联网连接的速度和中断情况。 1.导入所需库文件 首先&#xff0c;需要导入以下库&#xff1a; import speedtest import time from datetime import datetime这里选择了第…

关于 node 权限问题

执行npm install 命令错误-ERRNO-4080_npm err! if you believe this might be a permission-CSDN博客

JavaScript常见的DOM操作

文档对象模型 (DOM) 是 HTML 和 XML 文档的编程接口 常见的操作分为 创建节点 查询节点 更新节点 添加节点 删除节点 创建节点 createElement 创建新元素&#xff0c;接受一个元素&#xff0c;即要创建元素的标签名 createTextNode 创建一个文本节点 获取节点 qu…

Qt+Opencv实现视频二维码检测

编译器&#xff1a;Qt 5.12.2Visual Studio 2015 视觉库&#xff1a;OpenCV 4.5.5 能够加载MP4格式视频、读取、定位二维码并输出与反馈信息的软件 需要演示Demo可私信

《幸运的基督徒》Python

题目描述 有15个基督徒和15个非基督徒在海上遇险&#xff0c; 为了能让一部分人活下来不得不将其中15个人扔到海里面去&#xff0c; 有个人想了个办法就是大家围成一个圈&#xff0c;由某个人开始从1报数&#xff0c; 报到9的人就扔到海里面&#xff0c;他后面的人接着从1开始报…

软件测试相关概念和bug的相关总结

文章目录 什么是测试什么是需求测试用例(CASE)什么是BUG软件的生命周期开发模型瀑布模型螺旋模型增量模型和迭代模型 敏捷测试模型v模型W模型(双V模型) 软件测试的生命周期如何描述一个bugbug的级别bug的生命周期.产生争执怎么办 什么是测试 测试是测试人员用来检验软件的实际运…

Redis基本概念

什么是Redis 官方文档 Redis(Remote Dictionary Server) Redis 是一个开源的使用 ANSIC 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库&#xff0c;并提供多种语言的 API 的非关系型数据库。 传统数据库遵循 ACID 规则。而 Nosql&…

最长异或路径 ---- (字典树求异或最大)

目录 最长异或路径&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 代码实现&#xff1a; 最长异或路径&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 现在假设有一棵这样的树&#xff0c;我们并不关心每条边的路径权值为多少&#xff0c;假设划红线的…

WPS/Office 好用的Word插件-查找替换

例如&#xff1a;一片文档&#xff1a;…………泰山…………泰&#xff08;少打了山字&#xff09;………… 要是把“泰”查找替换为“泰山”&#xff0c;就会把前面的“泰山”变成“泰山山”&#xff0c;这种问题除了再把“泰山山”查找替换为“泰山”&#xff0c;有没有更简单…

MSF编译中遇到的问题整理,视觉惯性松组合//视觉惯性松耦合

首先感谢 https://blog.csdn.net/xiaoxiaowenqiang/article/details/81192045#comments_31558035 神帖需要进一步更新&#xff0c;希望大家可以给作者打钱&#xff0c;然后可诶诒理直气壮的顺便push原作者更新 下面是readme的内容 ethzasl_msf [ROS] 多传感器卡尔曼融合框架 E…

吴恩达deeplearning.ai:机器学习项目的完整周期伦理

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai专栏 文章目录 语音识别部署公平、偏见、伦理 这节博客中&#xff0c;我们主要看看构建一个机器学习的完整周期是什么&#xff0c;也就是说&#xff0c;当你想构建一个有价值的机器学习系统时&am…

Freecad Assembly4装配模型设计入门

一、基本信息 本文内容&#xff1a;学习Assembly4装配模型设计功能。 2024年3月7日 最新版Freecad 0.21.2 最新版 Assembly4 0.50.8 下载地址&#xff1a;stoneold/FreeCAD_Assembly4 最新版 Assembly4 示例教程 下载地址&#xff1a;FreeCAD_Examples: Freecad Assmbly4 …

菜品上架与展示

菜品上架与展示 1、功能简介 1、实现菜品的上架 2、实现菜品的展示 2、代码展示 2.1 food类 package com.ham.pkg.ArryList;public class Food {private String name;private double price;private String desc;public Food(String name, double price, String desc) {this.…

CubeMX使用教程(3)——GPIO

在第二章我们完成了点灯仪式&#xff0c;这次我准备尝试把按键和灯结合起来&#xff0c;做一次GPIO的综合测试 实验任务为&#xff1a;按下按键1&#xff08;B1&#xff09;&#xff0c;第1个灯&#xff08;LD1&#xff09;亮&#xff1b; 按下按键2&#xff08;B2&#xff09;…

Vue3.0 vue.js.devtools无法显示Pinia调试工具

之前的配置方式&#xff1a; app.use(createPinia()) app.mount(#app) 更新配置方式&#xff1a; app.use(createPinia()).mount("#app") 设置之后即可显示调试工具

25考研资料PDF汇总

资料V馊public号ZL研知己 V馊public号ZL研知己 25考研资料PDF汇总