AMP

对 Web 平台互操作性的贡献(2020 年上半年)

网站

Web 开发人员继续面临着 Web 互操作性问题和重要功能缺乏实现的挑战。作为开源项目,AMP 项目 可以帮助代表开发人员并帮助解决这些挑战。在过去几年中,我们与 Igalia 合作,共同努力提高浏览器之间的可预测性和互操作性。标准和我们想要的互操作性程度可能是一个漫长的过程。新功能通常需要实验才能启动,在此过程中需要进行调整,然后,随着更多实现和用户开始探索该领域,做一些真正有趣的事情并发现边缘问题,我们继续推进互操作性。

AMP 和 Igalia 都很高兴能够在这个过程的所有阶段发挥重要作用,并帮助推动事物向前发展。今年上半年,我们一直在做以下工作…

图像的默认纵横比

在我们之前的博客文章中,我们提到了我们在 WebKit 中实现 intrinsic size 属性 的实验。虽然这对于标准化讨论来说是一个有用的原型,但最终人们达成共识,转向另一种方法。这种新方法解决了相同的用例,而无需使用新属性。这个想法很简单:使用图像指定的宽度和高度属性来确定默认纵横比。如果使用额外的 CSS(例如“width: 100%; height: auto;”),浏览器就可以计算出图像的最终大小,而无需等待图像下载。这避免了任何可能导致用户体验不佳的重新布局。这在 FirefoxChromium 中实现,我们在 WebKit 中也做了同样的事情。我们在一个标志下实现了这一点,该标志目前在 Safari 技术预览版和最新的 iOS 14 测试版中默认启用。

滚动

我们继续努力增强滚动功能。在 WebKit 中,我们从 scroll-behavior 开始,它提供了执行平滑滚动的能力。基于我们之前的补丁,它已经落地,并受到一个实验性标志“CSSOM View Smooth Scrolling”的保护,该标志默认禁用。平滑滚动目前有一个通用的平台无关实现,由 Web 进程中的计时器控制,我们继续努力寻找更有效的替代方案,依赖于本机 iOS UI 接口来执行滚动。

我们还开始研究过度滚动和过度滚动自定义,特别是针对 scrollend 事件。正如您可能预期的那样,scrollend 事件在滚动结束时触发,但它缺乏互操作性,需要一些额外的测试。我们为 程序化滚动用户滚动 添加了 Web 平台测试,包括滚动条、拖动选择和键盘滚动。有了这些,我们现在正在 WebKit 中开发一个补丁,该补丁支持程序化滚动和 Mac 用户滚动的 scrollend。

在 Chrome 方面,我们继续研究非默认书写模式下的标准滚动值。这是一组围绕滚动 API 及其与书写模式的交互方式的有趣挑战,以前并非完全互操作或定义明确。获得互操作性需要更改,我们必须确保这些更改是安全的。我们当前的更改已实现,并受到运行时标志“CSSOM View Scroll Coordinates”的保护。在 Google 工程师的帮助下,我们正在尝试收集用户数据,以决定是否可以安全地将其默认启用。

我们参与的另一个次要互操作性修复是确保框架的 scrolling 属性识别“noscroll”或“off”值。在 Firefox 中已经如此,现在在 ChromiumWebKit 中也是如此。

交叉点和调整大小观察器

正如我们在之前的博客文章中提到的,我们推动了 IntersectionObserver(在 iOS 12.2 中启用)和 ResizeObserver(在 iOS 14 测试版中启用)在 WebKit 中的实现。今年,我们对这些有用的开发人员 API 做了一些改进。

用户报告了 观察内部 iframe 的根元素 方面的困难,规范已修改为接受显式文档作为根参数。这在 Chromium 中实现,我们在 WebKitFirefox 中也实现了相同的更改。它目前在 Safari 技术预览版、iOS 14 测试版和 Firefox 75 中可用。

还报告了一个 ResizeObserver 在非默认缩放级别下错误地计算大小 的错误,这尤其会导致 Twitter 提要出现错误。我们在去年 4 月发布了一个补丁,该修复程序在最新的 Safari 技术预览版和 iOS 14 测试版中可用。

资源加载

我们关心的另一件事是如何才能赋予作者更多控制权和能力,让他们更有效地告诉浏览器如何管理资源加载并提高性能。

我们 2019 年开始的关于延迟加载的工作随着 规范 的成熟而发展了很多。

因此,WebKit 中的延迟图像加载 实现 通过了相关的 WPT 测试,并且功能齐全,与 Firefox 和 Chrome 的实现相当。但是,正如您可能预期的那样,当我们比较使用情况和实现说明时,很明显,确定 延迟图像加载何时开始 的定义还不够好。在将其启用到发行版之前,还需要做一些工作来改进这一点。相关的框架延迟加载工作尚未开始,因为规范尚未到位。

我们还添加了 实现 用于 stale-while-revalidate。stale-while-revalidate Cache-Control 指令允许一个宽限期,在此期间浏览器允许提供过时的资产,而浏览器正在检查更新版本。这对于非关键资源(例如字体)很有用,这些资源可以容忍一定程度的陈旧。该功能最近已在 WebKit 主干中启用,但它在最新的 iOS 14 测试版中仍然禁用。

对 WebKit 中的预取进行了改进,以考虑其缓存分区机制。在启用这项工作之前,还需要发布一些补丁,并可能更详细地指定(例如,预导航)。最后,对各种通用的 Fetch 改进进行了改进,提高了 Fetch WPT 得分。示例包括

下一步

在滚动和资源加载改进方面还有很多工作要做,我们将继续关注提到的功能,例如 scrollend 事件、过度滚动行为和滚动行为、延迟加载、stale-while-revalidate 和预取。

作为对图像纵横比计算所做工作的延续,我们将考虑更通用的 CSS aspect-ratio 属性。诸如 Web Vitals 项目提供的性能指标对于 Web 开发人员来说也很重要,以确保他们的网站提供良好的用户体验,我们愿意调查在 Safari 中对这些指标的支持。

我们喜欢做这项工作来改进平台,我们很高兴能够以有助于改善我们所有人的 Web 公共资源的方式进行合作。