9

前端性能优化——采用高效的缓存策略提供静态资源 - 飞仔FeiZai

 1 year ago
source link: https://www.cnblogs.com/yuzhihui/p/17215274.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

前端性能优化——采用高效的缓存策略提供静态资源

一、发现性能问题

通过 Chrome 开发者工具的 Lighthouse 工具对目标站点的某个页面进行分析,其生成的报告如图所示:

img

由分析报告可知,该目标站点存在多项待优化的性能问题,如减少未使用的 JavaScript采用高效的缓存策略提供静态资源等问题,本文主要分析并解决采用高效的缓存策略提供静态资源问题。

二、分析性能问题

Lighthouse 会标记所有未被缓存的静态资源:

img

Lighthouse 认为一个资源是可缓存的,当且仅当以下所有条件都满足:

  • 该资源是字体、图像、媒体文件、脚本或样式表。
  • 该资源具有 200、203 或 206 HTTP 状态码。
  • 该资源没有显式的 no-cache 策略。

当页面未通过审计时,Lighthouse 会将结果列在一个具有三列的表格中:

列名 说明
网址 可缓存资源的位置
缓存 TTL 资源当前的缓存持续时间
传输文件大小 如果被标记的资源已经被缓存,用户可以节省多少数据的估算值

通过分析 Lighthouse 工具对目标站点生成的检测报告,发现采用高效的缓存策略提供静态资源这一项中的缓存 TTL 列,有一些静态资源文件的值为 None,也就是说该目标站点有部分静态资源未被缓存,那么这部分资源在重复访问时,会重复向服务器发送请求,因此该情况将明显影响目标站点性能。

三、解决性能问题

为了使静态资源缓存,需要在服务器端配置 HTTP 响应标头。标头控制浏览器缓存的行为。以下是一些有关缓存的重要标头:

  • Cache-Control:用于控制资源的缓存机制。通过设置值为 public 或 private 来指定资源是否可以被缓存,并通过设置 max-age 指定资源应该被缓存的时间长度。
  • Expires:允许指定一个过期时间,过期后,浏览器必须重新获取资源。
  • ETag:允许服务器标识资源,并使用 If-None-Match 请求头进行缓存验证。
  • Last-Modified:允许服务器指定资源最后修改的时间,并使用 If-Modified-Since 请求头进行缓存验证。

请配置你的服务器返回 Cache-Control HTTP 响应头:

Cache-Control: max-age=31536000

max-age 参数告诉浏览器它应该将资源缓存多长时间,单位为秒。以下示例将持续时间设置为 31536000,对应于 1 年:60 秒 × 60 分钟 × 24 小时 × 365 天= 31536000 秒。

以在 Nginx 中配置 Cache-Control 响应头为例:

http {
    server {
         location / {
            root /html;
            index index.html index.htm;

            # # 设置缓存时间为 1 天
            # expires 1d;

            # 开启缓存,并设置一年的缓存期
            add_header Cache-Control "public,max-age=31536000";
        }
    }
}

可以通过配置 expires 参数和 Cache-Control 的 max-age 来指定缓存期。

add_header Cache-Control "public,max-age=31536000"; 开启了缓存,并指定了缓存类型为 public,表示响应可以被客户端和代理服务器缓存,max-age 指定了资源的缓存期为 31536000 秒。

Nginx 服务器端设置 Cache-Control 响应头后,访问静态资源的响应如图所示:

img
img

需要注意的是,长时间的缓存期存在一个问题:用户可能看不到静态文件的更新。但是可以通过配置构建工具来解决该问题,在静态资源文件名中嵌入哈希来避免这个问题,以便每个版本都是唯一的,从而促使浏览器从服务器获取新版本。(要了解如何使用 webpack 嵌入哈希,请参阅 webpack 的缓存指南。)

如果资源经常更新且实时性很重要,那么可以将其缓存设置为 no-cache,但浏览器仍会缓存该资源,不过首先会与服务器进行检查,以确保资源仍然是最新的。

此外,并不是缓存期越长越好。而是需要根据实际需求进行权衡,以决定资源的最佳缓存期。

通过在 Nginx 开启缓存,并设置合适的缓存期,目标站点的性能检测报告如图所示:

img

由上图可知,性能评分并没有改变,但在诊断结果下已没有采用高效的缓存策略提供静态资源这一项,这一项已经被移入已通过的审核,也就是该项通过在服务器设置 Cache-Control 的方式得到了性能上的优化。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK