🩹 简单聊一聊 Vite 开发模式下的缓存策略

阿轩的BUG
文章191
评论56
标签101
站点日志
作者总数:1位
置顶文章:0篇
标签总数:101条
文章总数:196篇
评论总数:56条
微语总数:149条
运行天数:2314天
最近更新:2024-09-30
文章标签
最新评论
Sherlock
2025-08-21
不是应该打包成apk文件吗,怎么突然就运行编译了,下一步呢
老金er
2025-05-25
人生设计非常必要,在信息化发达的今天,周围大部分人依然只能过着人生工程模式生活,长时间生活洗礼后,尽管“人生工程”已经不再适合很多人,他们也无法做出任何改变,人生设计给我们提供了新的思路,值得尝试
赏帮赚
2025-05-25
职场太多的尔虞我诈
三笑
2024-08-16
emlog6.0.1可以升级支持吗?
pony
2024-07-08
这篇文章提供了一种新的人生规划方法——"人生设计",它借鉴了产品设计的理念,鼓励人们以创造性和探索性的方式思考和规划自己的生活。以下是对这篇文章的几个评价维度: 创新性:将产品设计的理念应用于人生规划是一个新颖的视角,为人们提供了一种跳出传统生活轨迹,探索个性化生活路径的方法。 实用性:文章不仅提出了理念,还详细介绍了具体的实施步骤,包括自我评估、制定计划、原型设计和实践选择等,具有很强的操作性。 启发性:通过强调好奇心、不断尝试、重新定义问题等心态,文章鼓励人们打破常规,勇于探索未知,这对于激发个人潜能和创造力具有积极作用。 适应性:"人生设计"理念适用于不同人生阶段和不同背景的人,无论是希望从头开始的人,还是已经取得一定成就但希望探索新方向的人,都可以从中获得启发。 情感共鸣:文章对许多人对传统生活轨迹的不满和对改变的渴望进行了深刻的洞察,能够引起读者的共鸣。 可持续性:人生设计强调的是一个持续迭代和试错的过程,这与现实生活的发展规律相吻合,有助于人们在不断变化的环境中做出适应性调整。 教育意义:作为一种人生规划方法,"人生设计"可以作为教育的一部分,帮助年轻人更早地学会自我探索和规划,为未来的生活和职业发展打下基础。 局限性:尽管"人生设计"提供了一种新的思考框架,但它可能需要个人具备一定的自我认知和反思能力,对于一些缺乏自我探索经验的人来说,可能需要额外的指导和支持。 总体来说,这篇文章提供了一种有价值的人生规划方法,对于那些渴望改变、寻求个性化生活的人来说,是一种有益的参考和指导。
首页值得一看 🔍️

没有起作用的协商缓存

为什么标题是没有起作用的协商缓存呢?

在回答这个问题之前,小编先给大家简单介绍一下 Vite 开发模式下的缓存策略。在 Vite 中,静态资源分为两类:预构建内容和业务代码。其中,预构建内容通常是由项目中的第三库生成的,采用强缓存策略,业务代码则采用协商缓存策略。

举个 ?:

image.png

图中 chunk-xxx 格式的内容就是预构建内容,响应头中通过 cache-control 字段中的 max-age = 3153600, 指明该文件采用强缓存策略。在请求时,可以通过修改请求的版本号 v=xxxx 来规避强缓存。

image.png

App.tsx,业务代码,采用协商缓存策略。

了解完这个以后,小编就通过 2gif 动图来给大家演示一下为什么说协商缓存没有起作用。

首先是dev server 启动后首次访问应用的 gif 动图。

Nov-04-2022 15-35-09.gif

在这个 gif 动图中,大家可以看到请求静态资源时,会走强缓存和协商缓存。仔细看这些请求,我们会发现在请求 less 类型的文件时,尽管走了协商缓存,但依旧要消耗很长的时间,导致首屏性能受到影响。

image.png

接下来,小编再给大家看一个二次访问应用的 gif 动图。

Nov-04-2022 16-00-47.gif

这次,首屏性能要好很多。打开 network, 我们发现请求 less 类型的文件,只用到了十几毫秒,比之前的 2s 多要好太多了。

image.png

那这是为什么呢?明明返回的状态码都是 304,为什么会是两种效果呢?这里面是有什么说法吗?

答案其实很简单,那就是两次判断 304 的逻辑不一样。

我们知道,协商缓存,通常需要在发起请求时,在请求头中添加 If-None-Match 字段,携带请求文件对应的 ETag 信息。当 dev server 收到请求时,会将请求头的 ETag 和请求文件的 ETag 信息做对比,如果没有变化,返回 304 通知浏览器使用本地缓存,反之则返回新的文件内容。

在获取请求文件的 ETag 信息这一块儿,Vite 有自己的一套处理逻辑。

dev server 内部,有一个缓存对象 - moduleGraph, 用来缓存请求过的文件内容和对应的 ETag 信息。

dev server 启动以后,这个对象是空的。此时如果浏览器发起业务代码请求,dev server 需要根据请求,将请求 url 解析为文件的本地路径(resolve)、读取文件内容(load)、对文件内容做转换(transform - 如 less 转换为 css)、计算 ETag,并缓存到 moduleGraph 中。 此时,如果请求中 If-None-Match 字段中携带的 ETag 信息和新计算的 ETag 信息一致,server 端会将状态码设置为 304,不返回转换以后的内容。

当浏览器再次请求相同文件时,dev server 会根据请求路径直接从缓存中去读取文件内容和 ETag 信息,然后和请求中 If-None-Match 字段中携带的 ETag 信息做比较。如果一致,server 端直接将状态码设置为 304,通知浏览器使用本地缓存。

了解了这些,那么首次访问应用时协商缓存为什么没有起作用就好理解了。因为这个时候,dev server 内部的缓存为空,所有的请求都需要经历 resolveloadtransform 的过程,导致响应耗时较久。

哈哈,是不是很简单呢,?。

结束语

到这里,关于 Vite 开发模式下的缓存策略就介绍完了。

最后,我们做一个简单的总结:

  • 开发模式下,请求预加载文件采用强缓存策略,请求业务文件采用协商缓存策略。

  • 首次访问应用请求业务文件时,尽管会命中协商缓存,但 sever 端依旧会进行 resolveloadtransform 操作,导致响应需要消耗一定的时间。

  • 二次访问应用,强缓存和协商缓存同时起作用,性能很好。

其实,关于结论中提到的第二点,我们还是有办法进行优化的,比如说采取 Webpack5 的缓存策略,在 dev server 关闭之前将 moduleGraph 缓存到本地,等到再次启动时读取本地缓存。这一点,小编将会在后面单独写一篇文章来介绍,感兴趣的小伙伴们可以保持关注哦,?。

上一篇
⚡️ Node.js v19,它来了!详解 6 大特性
下一篇
🔥 localStorage容量太小?试试它们