当前位置: 首页 > news >正文

浏览器——HTTP缓存机制与webpack打包优化

文章目录

    • 概要
    • 强缓存
      • 定义
      • 开启
    • 关闭强缓存
    • 协商缓存
      • 工作机制
        • 通过Last-Modified + If-Modified-Since
        • 通过ETag + If-None-Match
    • 不使用缓存
    • 前端利用缓存机制,修改打包方案
      • webpack 打包
      • webpack 打包名称优化
        • webpack 默认的hash 值
        • webapck其他hash 类型
        • 配置webpack打包
      • webpack 代码分割优化
    • 小结

概要

在前端开发中,经常接触到JavaScript脚本文件、CSS、HTML文件,每一次开发后,我们需要重新编译,会导致文件名发生变化。这样使得浏览网页时候,需要重新加载资源

如果能合理利用浏览器的缓存,可以提高响应速度。

浏览器缓存涉及到客户端和服务器之间的交互,当浏览器请求一个资源的时候,他首先检查该资源是否已经存在于HTTP缓存中,如果存在,并且满足不过期条件,浏览器则会使用缓存的资源,而不会从服务器重新请求。这个就是缓存的作用。

在实际的项目开发中,浏览器为我们提供下面的三种缓存机制:强缓存、协商缓存和不使用缓存,下面针对以上三个类型进行说明。

强缓存

定义

强缓存,直接使用缓存文件,不请求服务器。

开启

要实现强缓存,可以通过设置HTTP响应头和cache-control 、Expires字段来实现

  • 设置cache-control :在服务器响应中添加Cache-Control:max-age=3600,这将告诉浏览器可以将对应http资源缓存3600秒。这个时间内,浏览器直接从本地缓存加载该资源,而不会向服务器发送请求。
HTTP/1.1 200 OK
Date: Wed, 21 Oct 2025 07:28:00 GMT
Cache-Control: max-age=3600
Content-Type: text/html; charset=utf-8
Content-Length: 131
  • 设置 Expires:另一种设置方式就是使用Expire 字段,它的值是一个具体的时间,例如,Expires: Wed, 21 Oct 2025 07:28:00 GMT,表示资源将在2025 07:28:00之后过去

关闭强缓存

如果需要关闭强缓存,可以使用Cache-Control: no-cache,这将迫使浏览器每次都向服务器发送请求,通过协商机制来决定是否命中缓存

当设置成为no-store时,则完全禁止使用任何缓存,不存在协商,直接拉取服务器资源,重新加载。

协商缓存

浏览器协商缓存,也称为弱缓存,是一种利用HTTP响应头中的Last-Modified 和Etag字段来验证资源是否修改的机制,来决定是否使用本地缓存。在使用协商缓时候,一定要设置cache-control:no-cache ,这样才能发起请求,向服务器确认资源是否被修改。

工作机制

通过Last-Modified + If-Modified-Since

1.当我们第一次请求的时候,浏览器会在头添加Last-Modified 字段,这个值表示资源最后修改的时间

2.在这个资源后续的请求中,浏览器都会在请求头中,添加 If-Modified-Since 字段,这个值就是上一次服务器在响应头添加的Last-Modified 的值。

3.服务器接受到这个请求后,会根据 If-Modified-since 的值与服务器上的资源做对比,如果值不一致,服务器资源发送变化,则服务器返回最新的资源新的 last-Modified 字段

4.如果对比发现,服务器上资源最后修改时间请求的 If-Modified-since一致,则返回304 Not Modified 状态码,告诉浏览器可以使用本地缓存

通过ETag + If-None-Match

通过 ETag 方式来实现的话,原理和流程和上诉的一致,不同的是ETag 值表示文件唯一标识,这个值随着随着文件内容改动而发生变化,而如果文件内容没有改变,则ETag 值不会发生变化

在我们实际开发中,可以将ETag 理解成为文件的hash值,一旦文件改动,hash值变化。

不使用缓存

不使用缓存,将告诉浏览器,每一次加载资源,都需要重服务器请求获取最新的资源文件,可以通过以下的方式来实现

  • 设置 Cache-Control :在响应头上,将Cache-Control 设置为 no-store。将禁止使用任何缓存。
  • Expire 字段设置为0 ,表示资源立马过期。

前端利用缓存机制,修改打包方案

webpack 打包

我们日常的开发中,利用webpack 进行资源打包,默认情况下,生成的文件名称,带有hash 值。如下图中,用红线标出的地方,都是hash值。

在这里插入图片描述

这个hash 值是全局的不局限于当前文件,也就是说,只要当前项目有任何一个模块或文件的内容发生改动的时候,项目的hash值都会发生变化

如此一来,文件名称改动了,我们打包部署到服务后,客户端需要重新获取资源,而无法使用缓存来加快响应速度。

webpack 打包名称优化

webpack 默认的hash 值

在Webpack中,输出文件名的哈希值默认是[hash],这意味着每次构建时, 只要项目中有任何文件发生变化,生成的文件哈希值就会改变。这种哈希值与整个项目有关,因此它是全局的,不特定于某个文件或模块

webapck其他hash 类型

我们可以通过手动配置webpack 打包文件,来实现输出文件名的hash的控制,webpack 为我们提供处理[hash] 以外的方案,如下

  • contenthash
    [contenthash] 只有当前文件内容发生改动hash值才会发生变化。这有助于确保只有当文件内容发生变化时,文件名才会改变,从而有效地利用浏览器缓存。
  • chunkhash
    [chunkhash] 在一个文件中,如果被依赖的模块引入的文件资源发生变化时hash 值发生变化,而如果文件本身自己内容发生改动hash值是不会变化的。
配置webpack打包

我们可以通过手动配置webpack 输出文件名,将【hash】修改为【contenthash】来优化。

在webpack 项目中,可以修改 webpack.config.js 文件如下:

module.exports = {output: {filename: '[name].[contenthash].js',chunkFilename: '[name].[contenthash].chunk.js'},
};

webpack 代码分割优化

在我们日常开发中,常常引入第三方库,如vue.js ,elementUi等。这些第三方库,在我们项目搭建初期版本已经固定了后面不需要改动,如果修改升级,则另外讨论。

如果我们可以将这些第三方库,和自己手写的源码分割处理将第三方库独立出来,即使我们自己写的代码改动,不会影响第三方库文件模块,从而实现缓存命中。

幸运的是,webpack 默认带有代码分割的功能,它基于以下的规则

  • 共享模块
    如果一个新的块可以被多个入口点共享,Webpack会将其分割出来

  • 第三方库
    来自node_modules文件夹的模块通常会被分割出来。

  • 文件大小
    如果新的块在压缩和gzip之前的大小超过30kb,Webpack也会将其分割出来。

除此之外,我们可以通过 webpack.config.js 修改,如下

module.exports = {optimization: {splitChunks: {chunks: 'all',minSize: 30000,maxSize: 0,minChunks: 1,maxAsyncRequests: 5,maxInitialRequests: 3,automaticNameDelimiter: '~',name: true,cacheGroups: {vendors: {test: /[\\/]node_modules[\\/]/,priority: -10},default: {minChunks: 2,priority: -20,reuseExistingChunk: true}}}}
};

上面的参数,下面具体说明一下:

  • chunks
    控制哪些模块会被拆分。可选值,有:all、async(默认)、initial。
    all 表示所有模块都有可能被拆分async 表示只拆分动态加载initial表示不将动态和静态一起处理而是分开处理

  • minSize : 设置生成块最小单位(字节单位),如果生成的块小于这个大小,那么它不会被拆分

  • maxSize: 设置生成块最大单位,如果生成块大于这个大小,则会拆分成多个小块

  • minChunks:设置模块被引用的最小次数,一个模块被引用次数达到这个值后,才会被分到一个独立的包中

  • maxAsyncRequests:
    设置按需加载时并行请求最大数量。如果超过这个数量,则会把一些请求放到下一个chunk中

  • maxInitialRequests:
    设置入口点最大的并行请求数量。

  • cacheGroups
    这个选项允许你创建自定义的缓存组,以便更细粒度地控制哪些模块应该被分割,以及如何命名分割出来的文件。你可以为每个缓存组设置不同的测试条件、优先级、文件名等

小结

  • 实现强缓存,可以通过cache-control:max-age=36000,或这个Expire字段来实现

  • 关闭强缓存,可以设置 cache-control:no-cachecache-control:no-storeExpire:0

  • no-cache与no-store 区别在于,no-store禁止任何文件缓存,无法协商,no-cache 需要先和服务器协商来决定是否使用缓存

  • 协商缓存,可以通过Last-Modified/If-Modified-Since 或者 ETag/If-None-Match 来实现

  • 如果协商缓存中,文件没有发生该表,则将响应状态设置为304,告诉客户端使用缓存。

  • webpack 默认使用[hash]命名,颗粒度为整个项目文件,可以通过设置为[contenthash],将颗粒度细化到文件内容。

  • webpack 默认带有文件分割,可以分离第三方库。

相关文章:

浏览器——HTTP缓存机制与webpack打包优化

文章目录 概要强缓存定义开启 关闭强缓存协商缓存工作机制通过Last-Modified If-Modified-Since通过ETag If-None-Match 不使用缓存前端利用缓存机制,修改打包方案webpack 打包webpack 打包名称优化webpack 默认的hash 值webapck其他hash 类型配置webpack打包 web…...

STM32duino舵机控制-2

使用定时器进行精确延时,串口接收数据进行 50 0度 --十六进制32 250 180度 --十六进制FA 串口接收到AA 32两个字节,舵机转到0度;接收到AA FA,转到180度。请验证代码: const unsigned…...

【知识---如何创建 GitHub 个人访问令牌】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言登录到 GitHub 帐户。在右上角的头像旁边,点击用户名,然后选择 "Settings"。在左侧导航栏中,选择 "Develope…...

GBASE南大通用分享-ConnectionTimeout 属性

GBASE南大通用分享 获取或设置连接超时时间,值为‚0‛时没有限制。  语法 [Visual Basic] Public Overrides ReadOnly Property ConnectionTimeout As Integer Get [C#] public override int ConnectionTimeout { get; }  实现 IDbConnection.Connecti…...

ChatGPT 全域调教高手:成为人工智能交流专家

随着人工智能的快速发展,ChatGPT作为一种强大的文本生成模型,在各行各业中越来越受到重视和应用。想要利用ChatGPT实现更加智能、自然的交流,成为 ChatGPT 全域调教高手吗?本文将为您介绍如何通过优化ChatGPT的训练方法&#xff0…...

5.Hive表修改Location,一次讲明白

Hive表修改Loction 一、Hive中修改Location语句二、方案1 删表重建1. 创建表,写错误的Location2. 查看Location3. 删表4. 创建表,写正确的Location5. 查看Location 三、方案2 直接修改Location并恢复数据1.建表,指定错误的Location&#xff0…...

基于springboot校园台球厅人员与设备管理系统源码和论文

在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括校园台球厅人员与设备管理系统的网络应用,在外国管理系统已经是很普遍的方式,不过国内的管理网站可能还处于起步阶段。校园台球厅人员与设备管理系统具…...

MySQL(下)

四、事务 一、概念 对数据库的一次执行中有多条sql语句执行。这多条sql在一次执行中,要么都成功执行,要么都不执行。保证了数据完整性。MySQL中只有innodb引擎支持事务。 二、特性 事务是必须满足 4 个条件(ACID)&#x…...

如何搭建开源笔记Joplin服务并实现远程访问本地数据

文章目录 1. 安装Docker2. 自建Joplin服务器3. 搭建Joplin Sever4. 安装cpolar内网穿透5. 创建远程连接的固定公网地址 Joplin 是一个开源的笔记工具,拥有 Windows/macOS/Linux/iOS/Android/Terminal 版本的客户端。多端同步功能是笔记工具最重要的功能,…...

免费分享一套微信小程序外卖跑腿点餐(订餐)系统(uni-app+SpringBoot后端+Vue管理端技术实现) ,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的微信小程序外卖跑腿点餐(订餐)系统(uni-appSpringBoot后端Vue管理端技术实现) ,分享下哈。 项目视频演示 【免费】微信小程序外卖跑腿点餐(订餐)系统(uni-appSpringBoot后端Vue管理端技术实现)…...

后端学习:数据库MySQL学习

数据库简介 数据库:英文为 DataBase,简称DB,它是存储和管理数据的仓库。   接下来,我们来学习Mysql的数据模型,数据库是如何来存储和管理数据的。在介绍 Mysql的数据模型之前,需要先了解一个概念&#xf…...

2024最新版IntelliJ IDEA安装使用指南

2024最新版IntelliJ IDEA安装使用指南 Installation and Usage Guide to the Latest JetBrains IntelliJ IDEA Community Editionn in 2024 By JacksonML JetBrains公司开发的IntelliJ IDEA一经问世,就受到全球Java/Kotlin开发者的热捧。这款集成开发环境&#xf…...

消息中间件及java线程池

1. ActiveMQ是什么? Apache ActiveMQ是一个开源的消息中间件(Message Oriented Middleware, MOM),它遵循Java消息服务(Java Message Service, JMS)规范,提供高效、可靠和异步的消息传递功能。Ac…...

关于axios给后端发送数据的问题

这里需要用的插件:qs.js,是前端给后端发送的数组,需要序列化所以要用到这个插件,这里就提取连接在这里,需要的自提,需要导如进来,别忘记了 链接:https://pan.baidu.com/s/1qyD8v9wfd…...

web前端之ES6的实用深度解构赋值方法、复杂的解构赋值

MENU 前言解构对象解构数组解构混用 前言 ES6中允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。 使用解构赋值可以将复杂的代码整理的更加干净整洁。 解构对象 在没有使用解构之前,想要确定…...

uni-app 接口封装,token过期,自动获取最新的token

一、文件路径截图 2、新建一个文件app.js let hosthttp://172.16.192.40:8083/jeecg-boot/ //本地接口 let myApi {login: ${host}wx/wxUser/login, //登录 } module.exports myApi 3、新建一个文件request.js import myApi from /utils/app.js; export const r…...

AWS免费套餐——云存储S3详解

文章目录 前言一、为什么选择S3二、费用估算三、创建S3云存储注册账户登录账户创建存储桶关于官网相关文档 总结 前言 不论个人还是企业,日常开发中经常碰到需要将文档、安装包、日志等文件数据存储到服务器的需求。往常最常用的是云服务器,但是仅仅承担…...

2723. 两个 Promise 对象相加

说在前面 🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。 题目描述 给定两个 promise 对象 promise1 和 promise2,返回一个新的 promise。promise1 …...

【方法论】费曼学习方法

费曼学习方法是由诺贝尔物理学奖得主理查德费曼提出的一种学习方法。这种方法强调通过将所学的知识以自己的方式解释给别人来提高学习效果。 费曼学习方法的步骤如下: 选择一个概念:选择一个要学习的概念或主题。 理解和学习:用自己的方式学…...

Transformer模型 | Pytorch实现Transformer模型进行时间序列预测

Transformer模型最初是为了处理自然语言处理任务而设计的,但它也可以用于时间序列预测。下面是将Transformer模型应用于时间序列预测的一般步骤: 数据准备:准备时间序列数据集,包括历史观测值和目标预测值。通常,你需要将时间序列转换为固定长度的滑动窗口序列,以便输入…...

Git推送大量内容导致http 413错误

Git推送大量内容导致服务端HTTP 413错误 问题描述 使用git push 大量变更内容(超过60M)时报 http 413错误,详细错误信息: Compressing objects: 100% (2907/2907), done. Writing objects: 100% (6760/6760), 64.18 MiB | 1.18…...

pytest框架的基本使用

1. 测试框架的作用 测试框架不关系用例的内容 它关心的是:用例编排和结果收集 2. pytest框架的特点 1. 适用于python语言 2. 用法符合python风格 3. 有丰富的生态 3. 安装pytest框架 1. 新建一个项目 2. 在项目终端窗口输入如下命令,用于安装py…...

C++STL之map、set的使用和模拟实现

绪论​: “我这个人走得很慢,但是我从不后退。——亚伯拉罕林肯”,本章是接上一章搜索二叉树中红黑树的后续文章,若没有看过强烈建议观看,否则后面模拟实现部分很看懂其代码原理。本章主要讲了map、set是如何使用的&am…...

100天精通鸿蒙从入门到跳槽——第18天:ArkTS组件状态管理装饰器

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》 — Go语言学习之旅!《100天精通鸿蒙》 — 从Web/安卓到鸿蒙大师!100天…...

【前端】防抖

防抖用于限制连续触发的事件的执行频率。当一个事件被触发时,防抖会延迟一定的时间执行对应的处理函数。如果在延迟时间内再次触发了同样的事件,那么之前的延迟执行将被取消,重新开始计时 场景 :用户输入 项目中遇到的场景,需要鼠标悬浮在图表的时候,将ToolsTip里的数据…...

python对图片或文件的操作

一. base64 与图片的相互转换 1. base64 转图片 import base64 from io import BytesIO from PIL import Image# base64 编码的图像数据(示例) base64_data "iVBn9DHASKJDjDsdSADSf8lgg"# 将 base64 编码的字符串解码为二进制数据 binary_d…...

架构篇19:单服务器高性能模式-Reactor与Proactor

文章目录 ReactorProactor小结上篇介绍了单服务器高性能的 PPC 和 TPC 模式,它们的优点是实现简单,缺点是都无法支撑高并发的场景,尤其是互联网发展到现在,各种海量用户业务的出现,PPC 和 TPC 完全无能为力。今天我将介绍可以应对高并发场景的单服务器高性能架构模式:Rea…...

PyInstaller 将 Python 程序生成可直接运行的程序

图标转换地址:https://convert.app/#google_vignette 官方文档:https://readthedocs.org/projects/pyinstaller/downloads/pdf/stable/#page20 安装pyinstaller pip install pyinstaller执行打包 pyinstaller -i ./resource/w.icns -w -F whv.py --a…...

专有钉钉开发记录,及问题总结

先放几个专有钉钉开发文档 专有钉钉官网的开发指南 服务端(后端)api文档 前端api文档 前端开发工具下载地址 小程序配置文件下载地址 后端SDK包下载地址 专有钉钉域名是openplatform.dg-work.cn 开发记录 开发专有钉钉时有时会遇到要使用钉钉的api;通过 my 的方…...

Java Swing桌面项目打包成可执行jar

前言 最近有需求,将Swing项目打包为一个可执行的jar包,遇见了一些问题,参考AI助手,解决了遇到的问题,也有一些亲身实践体会,记录一下。开发环境IntelliJ IDEA,JDK8,用kotlin语言实现…...