我陷入了网站速度优化的泥潭。我的网站在所有常见工具(特别是 PageSpeed 和 GT Metrics;在 Pingdom 工具上看起来还行)的评分都很差。
我的设置是单个 T3-Medium 服务器,运行 Apache 和 Wordpress,位于 AWS ELB 后面,并部署到 CloudFront 作为 CDN。
我第一次尝试提高性能包括
- 升级到中型(服务器运行大约六个网站,但这些网站规模都很小,所有网站的总访问量每天只有几千次访问,尽管如此,由于内存限制,“小型”实例甚至在单次点击时都过于缓慢),
- 安装了 WP Super Cache 插件(我已经在 CloudFront 后面运行,但安装了该插件来实际缓存页面本身)
- 向 CloudFront 行为添加了缓存控制标头
- 从缓存键中删除查询字符串(这不是传统的电子商务网站,Twitter 广告为每个用户添加了一个唯一的字符串,这基本上使得每个页面浏览都成为缓存未命中)
但是,即使这样,默认性能也是不可接受的。罪魁祸首似乎是 JavaScript 交付(和执行)。以下是根据我执行的手动干预量得出的 GT Metrics 的一些结果:
Cache-Miss Cache-Hit Cache-Miss Cache-Hit Cache-Miss Cache-Hit
Default Default Hammer YouTube Hammer Youtube Sledge Hammer Sledge Hammer
TTFB 1,100 91 75 66 75 72 | 74 74 122 74 54 75 | 76 86 104 86 63 45
FCP 2,200 1,100 4,200 494 519 383 | 1,100 2,700 1,400 710 415 622 | 1,200 1,200 1,200 388 338 256
LCP 3,300 2,000 6,300 1,900 1,700 1,800 | 1,800 3,500 2,000 2,700 881 1,600 | 1,900 2,000 2,500 684 617 490
Onload 4,600 3,200 7,600 2,300 3,000 2,700 | 2,900 4,900 2,700 3,100 1,500 2,500 | 2,000 2,000 2,400 766 824 489
TTI 4,700 3,300 7,600 2,500 2,900 3,200 | 3,000 8,000 2,800 3,400 1,700 3,000 | 8,000 6,800 1,200 6,700 6,700 6,400
如您所见,如果我不执行任何操作(前两个“默认”子表),则网站将需要近 3 秒才能加载缓存命中,而缓存未命中则通常需要 4 秒以上。
这才是问题的根源。下一步我应该做什么?下面我将描述我现在正在做的事情,但我不认为我将要描述的是互联网上的标准做法,而且显然互联网一般不会受到这种性能的影响。
使用大锤
我不确定从用户体验的角度来看哪一个指标最重要,但我怀疑在我的情况下是 LCP 和 onload(我可以想象对于某些网站来说是 TTI,但在我的例子中,在首屏以上没有什么可做的,所以如果 Lighthouse 仍在报告它的话,旧的 First CPU Idle 指标会很棒)。
我现在正在做的就是表格中“Sledge Hammer”部分的内容。我编写了一个脚本,删除所有不必要的 javascript src 标签,并且只在 5 秒后或第一次用户交互后才将它们放回。您可以看到结果。即使缓存未命中,网站也会在大约 2 秒内加载,缓存命中时,加载时间远低于 1 秒(我们可以忽略 TTI 数字,因为这是我的 5 秒延迟,并且不会影响首屏外观或交互性)。
好的,该网站正在“运行”,但实际上,不仅看起来似乎不需要在抽象中这样做,而且我真的很希望从一开始就让一些 javascript 运行起来。
深入研究后发现,问题似乎全都是第三方 JavaScript(即不在我的 CDN 上或不能在我的 CDN 上的内容)。有些问题非常严重,我可以在内部处理(例如,我可以告诉营销人员,“只在真正需要时使用 HotJar,然后将其关闭 — 它会使页面加载时间增加整整一秒”)。但有些问题只是“互联网标准” — Stripe 和 Google Analytics 分别在加载时间和运行时间之间增加了约 500 毫秒。
我可以继续微调我的大锤,就像 Tim 在评论中建议的那样,但这仍然感觉不对。在这个设置和(特别是第三方)JavaScript 方面,我肯定缺少了一些东西。