优化托管的 AMP 页面
本指南为网站管理员提供了关于如何优化其托管的 AMP 网站的提示和指导。
AMP 默认不快吗?
AMP 运行时针对速度进行了优化,并且如果您的 AMP 页面由 AMP 缓存提供服务,则它们将得到充分优化并提供最高的加载性能。例如,如果您的用户通过移动设备上的 Google 搜索访问您的 AMP 页面,默认情况下这些页面由 AMP 缓存提供服务。
但是,AMP 页面并非始终由 AMP 缓存提供服务。网站可能会决定从自己的服务器为其他流量来源显示 AMP 页面。最常见的用例是完全使用 AMP 构建的网站,例如 axios.com,用户直接访问该网站。另一个流量来源是 Twitter,它 开始链接到 AMP 页面,而不是提供标准的移动版本。这意味着如果用户单击 Twitter 移动应用程序中的链接,则该链接将转到您自己源上的 AMP 版本的页面(如果有)。
因此,您不能始终确定您的 AMP 页面仅由 AMP 缓存提供服务。对于您从自己的服务器提供 AMP 页面的这些情况,请务必确保您的 AMP 页面提供最佳的加载性能。
AMP 页面默认情况下加载速度很快,但是您可以实施一些额外的性能优化来帮助浏览器更快地加载 AMP 页面。本指南介绍了一些您在发布 AMP 页面时应考虑的优化。但是,在您开始阅读本指南之前,请确保您已涵盖所有基本 Web 性能最佳实践。特别是,图像优化对加载性能有很大影响。
例如,通过应用以下优化技术
- 优化的 AMP 运行时加载
- 预加载首屏图片(图片大小/编码本身没有更改)
- 优化自定义字体(在本例中,是 Google 字体)
“The Scenic” 模板加载速度在 3G 连接下快了两秒。
如果您想跳过详细信息,请使用AMP 页面体验指南来检查您的 AMP 页面是否存在可能的性能优化。
使用 AMP 优化器
服务器端渲染 AMP 布局是 AMP 缓存用来进一步加快加载时间的一种技术。通过服务器端渲染,可以删除 AMP 样板,以便在不运行 AMP 运行时 JavaScript 的情况下绘制 AMP 文档。例如,AMP 样板生成器的服务器端渲染版本 渲染速度是正常 AMP 版本的两倍!
如果您要发布 AMP 页面,则应使用AMP 优化器。AMP 优化器使您可以从自己的后端提供优化的 AMP 页面,其中包括服务器端渲染 AMP 布局。AMP 优化器还会自动执行本文档中描述的许多其他优化。
预加载首屏图片
AMP HTML 使用自己的图像元素:amp-img
。虽然 amp-img
比传统的 HTML img
标记有很多优点,但一个缺点是必须先加载 AMP 运行时才能开始图像下载。对于某些图像(例如产品页面的首屏图片),图像必须尽快加载至关重要。在这些情况下,请使用属性 data-hero
注释图像
<amp-img src="hero.jpg" data-hero ...>
这允许 AMP 缓存和 AMP 优化器服务器端渲染 img
,从而加快加载速度。另一个最佳实践是预加载图像,以确保浏览器尽快开始下载图像。
<head> <link rel="preload" href="/images/elephants.png" as="image"> </head> <body> ... <amp-img width="404" height="720" layout="responsive" src="/images/elephants.png" alt="..." > </amp-img> </body>
但是,如果您的响应式布局需要不同的首屏图片,具体取决于屏幕宽度怎么办?例如,桌面使用宽图片,而移动设备使用窄图片,如下所示
<amp-img width="404" height="720" alt="..." layout="responsive" src="/images/elephants_narrow.png" media="(max-width: 415px)"> </amp-img> <amp-img height="720" alt="..." layout="fixed-height" src="/images/elephants_wide.jpg" media="(min-width: 416px)"> </amp-img>
好处是 link rel=preload
也支持媒体查询。因此,我们可以在预加载语句中使用相同的媒体查询,如下所示
<link rel="preload" as="image" href="/images/elephants_narrow.png" media="(max-width: 415px)"> <link rel="preload" as="image" href="/images/elephants_wide.jpg" media="(min-width: 416px)">
顺便说一下,相同的方法也适用于 amp-video
海报图像
<link rel="preload" href="/images/poster.jpg" as="image"> ... <amp-video width="480" height="270" src="elephant.mp4" poster="/images/poster.jpg" layout="responsive"> ... </amp-video>
请确保将预加载语句放在视口声明之后,因为浏览器需要视口尺寸来确定屏幕宽度
<meta name="viewport" content="width=device-width"> ... <link rel="preload" media="(max-width: 415px)" ...>
考虑使用 Service Worker
既然所有主流浏览器都支持 Service Worker,那么最好评估一下在您的网站上添加 Service Worker 是否有意义。
我们知道有两种不同的架构模式可以实现可靠的快速导航
- 对于单页面应用程序:App Shell 模型(在 AMP 环境中称为 AMP-in-PWA)。此模式需要 Service Worker 将 AMP 文档升级到基于 App Shell 的 PWA 体验。
- 对于多页面应用程序:流式复合资源。Service Worker 缓存静态页眉和页脚,并在加载内容时使用流式处理来立即返回缓存的部分响应。
如果未使用这两种模式中的任何一种,并且无法缓存整个站点(仅对于非常小的站点才合理),则 Service Worker 可能会产生负面的性能影响。在这种情况下,最好的做法是不使用 Service Worker。
但是,如果您希望您的网站可以从主屏幕安装,或者想要提供离线体验,则必须使用 Service Worker。在这种情况下,必须使用导航预加载来减轻潜在的减速(注意:目前,导航预加载仅在 Chrome 中受支持)。
如果您的 AMP 网站使用 Service Worker,则以下是一些最佳实践
- 预缓存 AMP 运行时和扩展程序(例如,
amp-carousel
)。 - 预缓存徽标、字体和大多数页面上使用的其他静态内容。
- 使用缓存优先策略提供徽标、字体和图像。
- 使用过时重验证策略提供 AMP 运行时和扩展程序。
- 当为导航请求使用网络优先策略时,请确保启用导航预加载。
如果您正在寻找一种在 AMP 网站中开始使用 Service Worker 的方法,请查看此示例,该示例提供了实现所有这些最佳实践的 Service Worker。
预缓存不仅与从缓存的 AMP 页面过渡到您自己源上的非 AMP 页面有关,而且与从缓存的 AMP 页面过渡到您自己源上的 AMP 页面有关。原因是 AMP 缓存将 AMP 运行时 URL 从常青 URL 重写为最新的发布版本,例如
https://cdn.ampproject.org/v0.js
-> https://cdn.ampproject.org/rtv/001515617716922/v0.js
。
结果是从您自己的源提供的 AMP 页面无法从浏览器缓存中受益,并且在这种情况下必须再次下载(未版本化的)AMP 运行时。通过 Service Worker,您可以预缓存未版本化的 AMP 运行时并加快过渡。要了解有关 AMP 缓存为什么对 AMP 运行时 URL 进行版本控制的更多信息,请阅读本文档。
优化自定义字体
使用 AMP,您可以执行一些操作来优化字体加载(其中大多数实际上并非 AMP 所独有)
- 如果可能,请使用font-display: optional:仅当字体已经在缓存中时才使用该字体,如果尚未加载您的自定义字体,则会回退到系统字体。
- 优化你的网页字体(例如,使用 WOFF2 提供自定义字体)。
- 预加载自定义字体
<link rel="preload" as="font" href="/bundles/app/fonts/helveticaneue-roman-webfont.woff2" >
- 如果你使用 Google 字体或任何其他具有未知字体 URL 的字体提供商,请预连接相应的字体服务器
<link rel="preconnect dns-prefetch" href="https://fonts.gstatic.com/" crossorigin>
最后但并非最不重要的一点,尽量减少在页面上使用的自定义字体数量。如果可以,请使用系统字体而不是自定义字体,因为系统字体可以使你的网站与用户的操作系统相匹配,并有助于避免加载更多资源。
基本优化
当然,所有网页性能优化的基本知识也适用于 AMP 页面
- 优化图片和视频。图片优化可以对加载性能产生巨大影响。
- 压缩和精简 CSS 和 HTML。由于 AMP 页面中的所有 CSS 都是内联的,因此值得使用像 purifycss 这样的工具来删除未使用的 CSS。
- 使用 HTTP 缓存
- ...等等
-
作者: @sebastianbenz