Web 开发人员继续面临着 Web 互操作性问题和重要功能缺乏实现的挑战。作为开源项目,AMP 项目 可以帮助代表开发人员并帮助解决这些挑战。在过去几年中,我们与 Igalia 合作,共同努力提高浏览器之间的可预测性和互操作性。标准和我们想要的互操作性程度可能是一个漫长的过程。新功能通常需要实验才能启动,在此过程中需要进行调整,然后,随着更多实现和用户开始探索该领域,做一些真正有趣的事情并发现边缘问题,我们继续推进互操作性。
AMP 和 Igalia 都很高兴能够在这个过程的所有阶段发挥重要作用,并帮助推动事物向前发展。今年上半年,我们一直在做以下工作…
图像的默认纵横比
在我们之前的博客文章中,我们提到了我们在 WebKit 中实现 intrinsic size 属性 的实验。虽然这对于标准化讨论来说是一个有用的原型,但最终人们达成共识,转向另一种方法。这种新方法解决了相同的用例,而无需使用新属性。这个想法很简单:使用图像指定的宽度和高度属性来确定默认纵横比。如果使用额外的 CSS(例如“width: 100%; height: auto;”),浏览器就可以计算出图像的最终大小,而无需等待图像下载。这避免了任何可能导致用户体验不佳的重新布局。这在 Firefox 和 Chromium 中实现,我们在 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 中已经如此,现在在 Chromium 和 WebKit 中也是如此。
交叉点和调整大小观察器
正如我们在之前的博客文章中提到的,我们推动了 IntersectionObserver(在 iOS 12.2 中启用)和 ResizeObserver(在 iOS 14 测试版中启用)在 WebKit 中的实现。今年,我们对这些有用的开发人员 API 做了一些改进。
用户报告了 观察内部 iframe 的根元素 方面的困难,规范已修改为接受显式文档作为根参数。这在 Chromium 中实现,我们在 WebKit 和 Firefox 中也实现了相同的更改。它目前在 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 公共资源的方式进行合作。