[浏览器]缓存策略机制详解
在做页面性能优化的时候,有一个点容易被忽略,那就是资源缓存优化。
浏览器里缓存策略分为强缓存,协商缓存以及不缓存,每个缓存策略都有其适用的优化场景。
下面为大家详解何为强缓存,协商缓存
先说结论强缓>协商>不缓存。
强缓存
顾名思义,强制缓存,也就是说我的资源请求一次之后,接下来的时间段里如果请求头命中了则直接返回缓存里的资源。通常我们可以在devtools network里看到诸如:
from (disk or memory) cache这样的描述时,这个资源就是走的强缓存,我们可以查看请求头里的字段
这里有两个属性要注意,一个是Expires
,还有一个是Cache-Control
。
Expires
expires是http1.0的标准,意思在这个时间段里资源都是有效的,超过这个时间则过期需要重新请求。所以我们在请求时如果命中了expires则不会发起请求而是直接返回缓存(内存或者磁盘,对应的Memory,Disk)里的资源,没有命中则重新发起请求。
它是一个绝对值,所以我们可以修改本地的时间来让资源一直缓存或者直接失效。
正是因为这个不安全的因素,http1.0之后新增了Cache-Control字段来作为命中缓存的依据。
Cache Control
与expires不同 cache-control返回的是一个相对值,相对于资源缓存到服务器的时间。在这个有效期内则不会发起请求而是直接返回缓存,超出同样是发起请求来重新获取资源。
需要注意的是强缓存返回的状态码始终都是200,这点我们可以通过查看network里的大小这一栏来判断是否是强缓存,进而通过请求头来判断当前的缓存策略。
同时,上面我说的结论强缓大于协商的原因是,一旦走了强缓就不会再发起请求,所以自然而然就不会再命中协商缓存了。
协商缓存
同样从名字里我们可以知道,协商协商,肯定是客户端与服务器协商后决定究竟是走缓存呐还是重新发起请求。
协商缓存命中的判断依据是:
- 首次请求:
- 会在请求头上带上
Last-Modified
或者是ETag
- 会在请求头上带上
- 第二次请求时:
- 判断请求头里的
if-modified-since
是否与Last-Modified
相同或者是if-none-match
===ETag
,一旦有一个条件能达成则直接走缓存,否则就重新发起请求。
- 判断请求头里的
协商缓存会先在服务器里判断究竟是要走缓存还是重新发起请求,命中了协商缓存一般请求的状态码是304
点开请求头我们可以看到if-modified-since
和if-none-match
通过对比上一次发起的协商请求发现他们是一样的,这样就会命中协商缓存策略。
不缓存
就是不缓存资源,每次请求都拿最新的。
好处是不会被缓存资源困住,坏处是不缓存了每次都请求很耗服务器的性能。
下面通过koa
来实现这3个不同的缓存策略机制,新建项目直接npm init -y
,然后安装Koa和Koa router
import Koa from 'koa';
import Router from 'koa-router';
import fs from 'node:fs';
import path, { dirname } from 'node:path';
import { fileURLToPath } from 'node:url'const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const app = new Koa();
const filePath = path.join(__dirname, 'example.txt');
const router = new Router();router.get('/strong-cache', async ctx => {const stats = fs.statSync(filePath);const fileContent = fs.readFileSync(filePath, 'utf-8');// 缓存60sctx.set('Cache-Control', 'public, max-age=60');ctx.set('Expires', new Date(Date.now() + 60 * 1000).toUTCString());ctx.type = 'text/plain';ctx.body = fileContent
})router.get('/negotiation-cache', async ctx => {const stats = fs.statSync(filePath);const fileContent = fs.readFileSync(filePath, 'utf-8');const lastModified = stats.mtime.toUTCString();const etag = `"${stats.size}-${Date.parse(stats.mtime)}"`;ctx.set('Cache-Control', 'no-cache');ctx.set('Last-Modified', lastModified);ctx.set('ETag', etag);const ifModifiedSince = ctx.headers['if-modified-since'];const ifNoneMatch = ctx.headers['if-none-match']if ((ifModifiedSince === lastModified) || (ifNoneMatch === etag)) {ctx.status = 304;return;}ctx.type = 'text/plain';ctx.body = fileContent;
})router.get('/no-cache', async ctx => {const fileContent = fs.readFileSync(filePath, 'utf-8');ctx.set('Cache-control', 'no-store');ctx.set('Pragma', 'no-store');ctx.type = 'text/plain';ctx.body = fileContent;
})app.use(router.allowedMethods()).use(router.routes());app.listen(2000, () => {console.log('service run on http://localhost:2000')
})
运行这个服务,打开浏览器 然后在开发者工具devtools里的console里发起fetch请求测试
fetch('/strong-cache').then(res => res.text()).then(res => console.log(res))fetch('/negotiation-cache').then(res => res.text()).then(res => console.log(res))
然后再观察Network请求的情况即可。
相关文章:

[浏览器]缓存策略机制详解
在做页面性能优化的时候,有一个点容易被忽略,那就是资源缓存优化。 浏览器里缓存策略分为强缓存,协商缓存以及不缓存,每个缓存策略都有其适用的优化场景。 下面为大家详解何为强缓存,协商缓存 先说结论强缓>协商&g…...
Vue修饰符全解析
目录 一、事件修饰符 二、按键修饰符 三、系统修饰键 四、表单修饰符 五、鼠标修饰符 六、特殊修饰符 七、自定义修饰符 使用建议 一、事件修饰符 <!-- 阻止冒泡 --> <button click.stop"handleClick">点击测试</button><!-- 阻止默认行…...

OpenCV CUDA 模块图像过滤-----创建一个计算图像导数的滤波器函数createDerivFilter()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::cuda::createDerivFilter 是 OpenCV CUDA 模块中的一个工厂函数,用于创建一个计算图像导数的滤波器。这个滤波器可以用来计算图像…...
计算机视觉与深度学习 | Python实现CEEMDAN-ABC-VMD-DBO-CNN-LSTM时间序列预测(完整源码和数据)
以下是一个结合CEEMDAN、ABC优化VMD、DBO优化CNN-LSTM的完整时间序列预测实现方案。该方案包含完整的数据生成、算法实现和模型构建代码。 完整实现代码 import numpy as np import pandas as pd from PyEMD import CEEMDAN from vmdpy import VMD from sklearn.preprocessing…...

AWS関連職種向け:日本語面接QA集
1. 自己紹介(じこしょうかい) Q:簡単に自己紹介をお願いします。 A: はい、〇〇と申します。これまで約4年間、主にAWSを基盤としたインフラ設計・構築・運用に従事してまいりました。VPCやEC2、RDS、S3などの基本サービスの設計…...
【Macos】安装前端环境rust+node环境
Macos 安装前端环境 1、findar 新建目录 projects 2、安装brew 使用中科大镜像, 手动配置path 3、brew install git 4、 git clone githttp://10.10.9.201/software/dreame_sorting_app.git 5、安装vscode/hbuilderx/node 6、rustup切换镜像并安装https://rsproxy.cn/#getStart…...

(01)华为GaussDB((基于PostgreSQL))高斯数据库使用记录,dbeaver客户端配置高斯驱动,连接高斯数据库
高斯数据库是华为推出的一款基于PostgreSQL的企业级数据库产品,客户端使用通用的dbeaver dbeaver客户端配置高斯驱动 建议使用 dbeaver24.3.1及以上客户端,选择模式后执行sql会绑定模式名,如果使用dbeaver23.2版本,选择模式后执…...

ARM Linux远程调试
准备 虚拟机既能ping通开发板,又能ping通外网,还要能ping通Windows主机(如果你有上位机通信(tftp、vsftp、ssh)的需求) VMware 添加网络适配器2用作桥接网卡,原有的网络适配器保持为NAT模式 打开虚拟网络编辑器,配置VMnet0为桥接模式,外部连接设置为Realtek PCIe G…...

day24Node-node的Web框架Express
1. Express 基础 1.1 什么是Express node的web框架有Express 和 Koa。常用Express 。 Express 是一个基于 Node.js 的快速、极简的 Web 应用框架,用于构建 服务器端应用(如网站后端、RESTful API 等)。它是 Node.js 生态中最流行的框架之一,以轻量、灵活和易用著称。 …...
Webpack和Vite构建工具有什么区别?各自的优缺点是什么
Webpack 和 Vite 是两种主流的前端构建工具,分别代表了不同的设计理念和技术路线。以下是它们的核心区别和优缺点对比: 一、核心区别 维度WebpackVite设计理念基于打包(Bundle-Based)基于原生 ESM(Native ESM)开发模式全量打包后启动按需编译 + 浏览器直接加载 ESM构建工…...

让MySQL更快:EXPLAIN语句详尽解析
前言 在数据库性能调优中,SQL 查询的执行效率是影响系统整体性能的关键因素之一。MySQL 提供了强大的工具——EXPLAIN 语句,帮助开发者和数据库管理员深入分析查询的执行计划,从而发现潜在的性能瓶颈并进行针对性优化。 EXPLAIN 语句能够模…...
基于谷歌浏览器的Web Crypto API生成一对2048位的RSA密钥(公钥+私钥),并以JSON格式(JWK)打印到浏览器控制台
用Google Chrome 浏览器的Web Crypto API生成RSA密钥对:在浏览器环境中生成一对2048位的RSA密钥(公钥私钥),然后以JSON格式(JWK)将它们打印到控制台,方便开发者查看和使用。 // 控制台生成密钥对 (async () > {// 调用Web Crypto API生成…...

[CSS3]rem移动适配
前言 什么是移动端适配? 让页面的元素在屏幕尺寸变化时, 同比放大或缩小 移动适配的方案 rem:目前多数企业在用的解决方案 vw/vh:未来的解决方案 rem 体验rem适配 目标: 能够使用rem单位设置网页元素的尺寸 网页效果: 屏幕宽度不同,网…...

向量数据库及ChromaDB的使用
什么是向量数据库? 向量数据库(Vector Database),也叫矢量数据库,主要用来存储和处理向量数据。 在数学中,向量是有大小和方向的量,可以使用带箭头的线段表示,箭头指向即为向量的方…...

CodeBuddy实现pdf批量加密
本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 前言 在信息爆炸的时代,PDF 格式因其跨平台性和格式稳定性,成为办公、学术、商业等领域传递信息的重要载体。从机密合同到个人隐私文档,…...
编程中优秀大模型推荐:特点与应用场景深度分析
编程中优秀大模型推荐:特点与应用场景深度分析 编程中优秀大模型推荐:特点与应用场景深度分析GPT系列模型模型概述技术特点编程应用场景 DeepSeek系列模型模型概述技术特点编程应用场景 Claude系列模型模型概述技术特点编程应用场景 Llama系列模型模型概…...
orm详解--查询执行
深入解析 Django ORM 查询执行阶段 的核心机制,包括查询集的惰性特性、表达式树构建、SQL 编译过程及优化原理。以下是详细分析: 一、查询集(QuerySet)的惰性执行机制 1. 惰性特性的底层实现 核心类:django.db.mode…...

运行打印Hello World启动了多少线程?
序言 看网上说阿里二面问到了一个看似最简单且没有标准答案的一个问题,所有学习编程都是从打印hello World开始的,那运行打印启动了多少个线程? 启动了多少线程? 在运行一个简单的 “Hello World” 程序时,启动的线…...
C++项目中调用C#DLL的的方式
C项目中调用C#DLL的的方式 方法一:使用COM技术方法二:使用C/CLI方法三:使用P/Invoke(适用于C#导出非托管接口) 在C中调用C#编写的DLL,通常需要借助COM(Component Object Model&#…...
咳嗽止咳药笔记250526 , 磷酸苯丙哌林 , 喷托维林 , 右美沙芬
咳嗽止咳药笔记250526 止咳药的种类较多,根据作用机制可分为中枢性止咳药、外周性止咳药、祛痰药、抗组胺药及中成药等。以下是具体分类及效果分析: 一、中枢性止咳药 可待因 效果:直接抑制延髓咳嗽中枢,镇咳作用强且迅速&#x…...
vue pinia 独立维护,仓库统一导出
它允许您跨组件/页面共享状态 持久化 安装依赖pnpm i pinia-plugin-persistedstate 将插件添加到 pinia 实例上 pinia独立维护 统一导出 import { createPinia } from pinia import piniaPluginPersistedstate from pinia-plugin-persistedstateconst pinia creat…...
网络的协议和标准
网络的协议和标准 OSI参考模型 应用层 报文 网关 表示层 报文 会话层 报文 传输层 报文 网络层 数据包 路由器 数据链路层 帧 网桥交换机 物理层 位 中继器 集线器 TCP/IP协议簇 逻辑地址:每台设备都有一个ip地址 一个ip地址包包含网络号 子网络号 主机号可…...
十六进制字符转十进制算法
十六进制与十进制对照 十六进制十进制00112233445566778899A10B11C12D13E14F15 十六进制与十进制区别 十六进制是满16进1,十进制是满10进1,这里要注意下区别,16进制的字符里面为什么是0-9没有10,这里面进了一位,表示…...
跟Gemini学做PPT:汇报背景图寻找指南
PPT 汇报背景图寻找指南 既然前端功能已经完善,现在可以专注于汇报了。对于 PPT 背景图,你有几个选择: 1. 内置模板和主题: 优点: 最简单、快速,PowerPoint、Keynote、Google Slides 等演示软件都内置了…...

java交易所,多语言,外汇,黄金,区块链,dapp类型的,支持授权,划转,挖矿(源码下载)
目前这套主要是运营交易所类型的,授权的会贵点,编译后的是可以直接跑的,图片也修复了,后门也扫了 都是在跑的项目支持测,全开源 源码下载:https://download.csdn.net/download/m0_66047725/90887047 更多…...

(已开源-CVPR2024) RadarDistill---NuScenes数据集Radar检测第一名
本文介绍一篇Radar 3D目标检测模型:RadarDistill。雷达数据固有的噪声和稀疏性给3D目标检测带来了巨大挑战。在本文中,作者提出了一种新的知识蒸馏(KD)方法RadarDistill,它可以通过利用激光雷达数据来提高雷达数据的表征。RadarDistill利用三…...

【MySQL】 数据库基础数据类型
一、数据库简介 1.什么是数据库 数据库(Database)是一种用于存储、管理和检索数据的系统化集合。它允许用户以结构化的方式存储大量数据,并通过高效的方式访问和操作这些数据。数据库通常由数据库管理系统(DBMS)管理&…...
中小企业AI算力如何选?【显卡租赁】VS【自建服务器】
对于中小企业而言和科研单位来讲,AI算力的选择需综合考虑成本、灵活性、数据安全和技术迭代风险等因素。以下是显卡租赁与自建服务器的对比分析,帮助中小企业做出最优决策: 1. 成本对比 自建服务器 高昂的前期投入:搭建一个中等规…...
OpenHarmony 4.1版本应用升级到5.0版本问题记录及解决方案
目录 1. ERROR: ArkTS:ERROR File: E:/Hap/applications_contacts-OpenHarmony-5.0.0-Release/entry/src/main/ets/Application/MyAbilityStage.ts:33:9 No overload matches this call. Overload 1 of 4, (slot: NotificationSlot): Promise, gave the following error. …...
std::initialzer_list 与花括号{}数据列表
author: hjjdebug date: 2025年 05月 22日 星期四 15:50:23 CST descrip: std::initialzer_list 与花括号{}数据列表 文章目录 1.{数值列表}是什么?1.1 数组初始化 时 , 称为数组初始化列表1.2. 当用于容器时, 称为容器初始化列表1.3. 对于结构体或类,{…...