缓存缓存CSS的策略

2023-05-16

浏览器缓存CSS将带来主要的性能提升。 您确保服务器设置为发送标头,这些标头告诉浏览器在给定的时间内挂接到CSS文件。 最好的做法是,即使不是大多数站点,许多站点已经在这样做。

与浏览器缓存紧密结合的是缓存清除 。 假设浏览器将CSS文件缓存了一年(这并不罕见)。 然后,您想更改CSS。 您需要一种策略来打破缓存并强制浏览器下载CSS的新副本。

这里有一些方法。

CSS必须缓存起来才有意义……

为了确保这一点,这是缓存CSS文件的一些看起来不错的标头:

我们正在寻找那个Cache-Control and Expires标头。 我不是服务器配置专家。 我可能会看一下H5BP服务器配置。 但是,这里有一些经典的Apache / HTAccess方法来实现:

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)(\.gz)?$">
  Header set Expires "Thu, 15 Apr 2020 20:00:00 GMT"
</FilesMatch>
<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresByType text/css                  "access plus 1 year"
  ExpiresByType application/javascript    "access plus 1 year"
</IfModule>

查询字串

如今,大多数浏览器会看到带有不同查询字符串的URL作为不同文件,并下载新副本。 大多数CDN甚至都支持并建议这样做。

<link rel="stylesheet" href="style.css?v=3.4.1">

零钱吗? 更改为:

<link rel="stylesheet" href="style.css?v=3.4.2">

通过将服务器端变量设置为可在多个位置使用,可以使自己更容易。 因此,对其进行更改将立即破坏许多文件的缓存。

<?php $cssVersion = "3.4.2"; ?>

<link rel="stylesheet" href="global.css?v=<?php echo $cssVersion; ?>">

也许您甚至可以使用语义版本控制 。 您还可以定义一个常量 。

更改文件名

查询字符串并不总是有效。 某些浏览器没有将不同的查询字符串视为不同的文件。 而且某些软件(我听说过: Squid )不会使用查询字符串缓存文件。 史蒂夫·索德斯( Steve Souders) 告诉我们不要这样做。

类似的概念是更改文件名本身。 在HTML中是这样的:

<link rel="stylesheet" href="style.232124.css">

您将以编程方式处理此问题,而不是从字面上更改项目中的文件名。 由于该文件实际上不在服务器上,因此您需要执行一些技巧才能将其路由到正确的文件。 杰里米·基思(Jeremy Keith)不久前就对此进行了报道 。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+).(\d+).(js|css)$ $1.$3 [L]

这告诉服务器忽略JavaScript和CSS文件名中的这些数字,但是每当我更新该数字时,浏览器仍会将其解释为新文件。

他使用Twig,因此他使用的模板最终类似于:

{% set cssupdate = '20150310' %}

<link rel="stylesheet" href="/css/main.{{ cssupdate }}.css">

我相信您可以想象任何后端语言( 例如ASP )的版本。 通过使构建工具或部署脚本更新变量本身来进行升级。

基于文件更新日期的缓存清除“数字”

在搜索有关此缓存无效化内容的过程中,您会看到很多建议,建议您使用服务器检查文件的上次更新时间,以创建缓存无效化“数字”(数字,即您更改为无效化缓存的所有内容) )。

function autoversion($url) {
  $path = pathinfo($url);
  $ver = '.'.filemtime($_SERVER['DOCUMENT_ROOT'].$url).'.';
  return $path['dirname'].'/'.str_replace('.', $ver, $path['basename']);
}
<link href="<?php autoversion('/path/to/theme.css'); ?>" rel="stylesheet">

我对此不好说。 在我看来 ,要求您的服务器在每个综合浏览量中挖掘这些信息会非常繁琐,而且在生产中很危险。 过去,我做过类似的事情:“我将只让PHP在数据属性中输出图像的尺寸!” 才发现它使服务器瘫痪。 无论如何,要当心。

电子标签

ETags似乎是一个好主意,因为它们的全部要点是检查浏览器是否已经具有该文件副本的信息。

但是那里的大多数建议都说:“关闭您的ETags标头”。 雅虎说 :

ETag的问题在于它们通常使用使它们对托管站点的特定服务器而言唯一的属性构造。 当浏览器从一台服务器获取原始组件,然后尝试在另一台服务器上验证该组件时,ETag将不匹配,这种情况在使用服务器集群处理请求的网站上非常普遍。

另一个问题是它们不如实际的缓存有效。 为了检查ETag, 仍然需要发出网络请求。 不仅是影响性能的文件下载,还包括所有网络协商和延迟问题。

同样,这里不是专家,但是通常建议在Apache领域将其关闭:

<IfModule mod_headers.c>
  Header unset ETag
</IfModule>
FileETag None

框架为我们做

Rails资产管道

我对Rails Asset Pipeline和Sprockets有一点经验。 如果你问我,那是一个梦想的系统。 我在模板中链接样式表:

<%= stylesheet_link_tag "about/about" %>

并产生如下HTML:

<link href="http://assets.codepen.io/assets/about/about-7ca9d3db0013f3ea9ba05b9dcda5ede0.css" media="screen" rel="stylesheet" type="text/css" />

该高速缓存清除编号仅在文件更改时才更改,因此您只中断需要中断的文件上的高速缓存。 另外,它还有图像和JavaScript的方法。

WordPress的

如果您在WordPress中使用页面缓存工具(例如W3 Total Cache等),则可能不必担心filemtime业务过于filemtime服务器资源。

Gilbert Pellegrom 发表了使用它的WordPress特定技术 :

wp_register_style( 'screen', get_template_directory_uri().'/style.css', array(), filemtime( get_template_directory().'/style.css' ) );
wp_enqueue_style( 'screen' );

// Example Output: /style.css?ver=1384432580

WordPress插件崩溃了! 在幕后做同样的事情。 只是对所有内容都会自动执行。

代码包

CodeKit没有用于更改文件名的内置方法,但是它确实具有在您设置的情况下执行Shell脚本的方法。

迈克尔·拉塞尔(Michael Russell)的博客文章中介绍了如何将时间戳添加到文件本身中,我相信您可以进行修改以更改文件名。

制作工具

所有流行的任务运行器/构建工具thingies都具有可帮助更改文件名的插件。 Sufian Rhazi 也有在原始Node.js中执行此操作的帖子 。

咕unt声

  • 咕unt-缓存-半身像

古尔普

  • gulp-cache-bust
  • 吞噬者

西兰花

  • 西兰花-rev

在预处理器内

当链接其他资产中的资产时(例如,从LESS文件中链接到的图像),可以使预处理器工作。 本·纳德尔(Ben Nadel) 就此发表了一篇文章 。

异步CSS

随着关键CSS变得越来越重要,延迟加载CSS变得越来越重要。 还有其他一些原因也会推迟CSS的加载(也许是打印CSS或启动缓存)。

如果您要用loadCSS加载CSS(或者注入一个link标签 ),则需要更新它在JavaScript本身中请求的文件名。 与更改文件名不同,但没有什么不同。

所以

我错过了什么吗? 您的缓存清除策略是什么?

翻译自: https://css-tricks.com/strategies-for-cache-busting-css/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

缓存缓存CSS的策略 的相关文章

随机推荐

  • [Shell学习笔记] 命令行下的高级网络工具cURL命令

    原文 xff1a http www 1987 name 365 html Linux curl命令是一个利用URL规则在命令行下工作的文件传输工具 它支持文件的上传和下载 xff0c 所以是综合传输工具 xff0c 但按传统 xff0c 习
  • 74系列的型号

    74系列TTL数字逻辑集成电路系国际上通用的标准电路 其品种共分为六大类即 74xx 标准 74LSxx 低功耗肖特基 74Sxx 肖特基 74ALSxx 先进低功耗肖特基 74ASxx 先进肖特基 74Fxx 高速 只要序列号相同 xff
  • 【C#】使用fo-dicom完成BMP,JPG,PNG图片转换为DICOM文件

    最近研究了一下DICOM和BMP文件转换的问题 xff0c 也是很头大 度娘了很久 xff0c 也在CSDN等论坛看到一些断断续续的文件 xff0c 最主要的是代码只是片断 xff0c 不是完整的实现 头大了 首先 xff0c 了解一下BM
  • Atomix getting start 浓浓的机翻

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 概观 Atomix 2 1是用于构建容错分布式系统的全功能框架 Atomix将ZooKeeper的一致性与Hazelcast的可用性和性能相结合 xff0c 使用一组定制通
  • Formik与antd-mobile的移动端的表单实践(下)

    大家好 xff0c 工作闲暇之余又来续写一下Formik这个库的文章了 xff0c 这次文章主要内容为如下 xff1a 更多表单组件的封装示例 单选 多选按钮选择器时间选择器文本输入框提交按钮Formik的表单验证Formik的表单提交处理
  • nginx与tomcat组合使用时获取客户端真实IP

    为什么80 的码农都做不了架构师 xff1f gt gt gt Nginx 43 Tomcat做反向代理在Tomcat中无法获取用户的真实IP解决步骤 xff1a 1 在Nginx配置文件中配置传递到Tomcat的IP变量名 xff1a 一
  • 记一次创建云硬盘失败的解决过程

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 背景 登录dashboard xff0c 点击创建云硬盘失败 xff0c 而且是点击完就直接报error错误 二 解决经过 思路一 xff1a 新上传的image镜像
  • linux samba 配置

    1 所需要软件包 samba common软件包中提供了samba服务器和客户中都必须使用的公共文件 samba软件包中包括了samba服务器程序的所有文件 samba client软件包中提供了Samabe客户机器的所有文件 system
  • tightvnc 远程开机_如何在Linux中安装和访问TightVNC远程桌面?

    tightvnc 远程开机 TightVNC is a very handy remote desktop application which is based on VNC protocol TightVNC is mostly used
  • linux grub命令行,引导工具GRUB详解

    导读 引导程序是驻留在硬盘第一个扇区 MBR 主引导记录 的程序 GRUB是一个功能强大的多系统引导程序 xff0c 专门处理Linux与其它操作系统共存的问题 下面就由我介绍一下grub conf文件里的具体内容及其含义 使用一下命令可以
  • Formik官方应用案例解析(三)使用react-select

    react select简介 React Select是github上一个极其火的控件库 xff0c 星数达到13004 xff0c 它是React开发中几乎是你必需打交道的一个内容 React Select的基本功能实现的是一个表单中的常
  • Juniper MPLS Static LSP

    MPLS Static LSP 1 配置接口去接收和处理MPLS帧 user 64 R1 set interface ge 1 0 0 unit 0 family inet family mpls 2 指定哪个接口运行MPLS user 6
  • 201803考试批次2C 程序设计语言,重庆大学201803批次2可视化程序设计(VB)D卷答案...

    201803考试批次2可视化程序设计 VB D卷 5 O0 R K G l可视化程序设计 VB l K 3 Z t 一 单项选择题 共 10 题 0 20 分 c c N G1 F4 D6 39 64 1 下列程序段的执行结果为 Dim x
  • VNC注册码

    5D7L8 ZQXSA 2L5D4 4UFB4 PWDLA 转载于 https blog 51cto com ciscolinux 1320541
  • matlab中矩阵可视化,matlab-如何可视化显示颜色和值的矩阵?

    您可以使用内置功能 39 X Y Z TickLabelRotation 39 和 39 X Y Z TickLabelRotation 39 并调整图形对象的许多参数 xff0c 轻松地自己创建此类绘图 这是一个例子 xff1a mat
  • Formik与antd-mobile的表单实践(上)

    概览 本文主要用于记录该次使用Formik时用到的相关接口 xff0c 而侧重点不在antd mobile xff0c 对antd mobile会贴出对应组件API 文章需要基础知识点 xff1a React基本知识ES6基本知识 文章实践
  • AT&T CORD架构解读

    这一两年 xff0c 我们时常听到CORD项目 xff08 Central Office Re Architected as a Data Center xff09 AT amp T希望通过CORD项目将运营商网络中的传统端局 xff08
  • 发送端口25,465,587端口疑问解答

    25端口 xff08 SMTP xff09 xff1a 25端口为SMTP xff08 Simple Mail Transfer Protocol xff0c 简单邮件传输协议 xff09 服务所开放的 xff0c 是用于发送邮件 如今绝大
  • brctl 命令详解

    安装网桥管理工具包 xff1a bridge utile 96 96 96 yum install bridge utils y 96 96 96 96 96 96 使用brctl命令创建网桥br1 96 96 96 brctl addbr
  • 缓存缓存CSS的策略

    浏览器缓存CSS将带来主要的性能提升 您确保服务器设置为发送标头 xff0c 这些标头告诉浏览器在给定的时间内挂接到CSS文件 最好的做法是 xff0c 即使不是大多数站点 xff0c 许多站点已经在这样做 与浏览器缓存紧密结合的是缓存清除