当前位置: 首页 > 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模型应用于时间序列预测的一般步骤: 数据准备:准备时间序列数据集,包括历史观测值和目标预测值。通常,你需要将时间序列转换为固定长度的滑动窗口序列,以便输入…...

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来&#xf…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...