如何优化 wordpress / apache / AWS 上的 javascript 交付?

如何优化 wordpress / apache / AWS 上的 javascript 交付?

我陷入了网站速度优化的泥潭。我的网站在所有常见工具(特别是 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 方面,我肯定缺少了一些东西。

相关内容