
编者注:以下客座文章由 Igalia 项目经理 Hanna Zarour 撰写
AMP 项目很荣幸能够代表开发人员,帮助他们解决网络互操作性和重要功能实现缺乏的问题。在过去几年中,我们与 Igalia 合作,以提高浏览器之间的互操作性和可预测性。我们想要的标准和互操作性程度可能是一个漫长的过程。新功能需要大量的规划、实验和方向修正,才能开始更多实现,并让用户发现问题以进一步改进。
AMP 和 Igalia 都非常高兴能够在这一过程的所有阶段发挥重要作用,并推动事情向前发展。 我们为我们在 2020 年下半年共同完成的工作感到自豪。下面重点介绍了这项工作的细节
滚动
Chromium
在 Chrome 中,我们继续在非默认书写模式下处理标准滚动值。正如我们在之前的博客文章中提到的,我们的更改受到运行时标志“CSSOM View Scroll Coordinates”的保护。由于获得互操作性需要更改滚动值,因此我们必须非常谨慎地处理它可能造成的潜在破坏。在过去几个月里,我们一直在努力进行必要的工作,以确定移除此标志是安全的。在与 Google 工程师合作后,以下是我们最终确定此操作安全并移除标志的方法
首先,我们使用 UMA/UKM 收集了几个月关于潜在破坏的数据,并分析了这些数据。完整报告的摘要可以在此处找到。
此外,我们在blink-dev 线程中讨论了该报告,并决定逐步启用 Finch 标志(首先在 Canary 中启用,然后在稳定版 85+ 中启用)。同时,我们一直在监控与滚动相关的错误,并在风险高于预期时撤回。我们很幸运地只发现了很少的错误。我们对数据的分析也显示出良好的结果。为了完成此操作,我们决定移除运行时标志的旧代码。
WebKit
我们继续努力增强 WebKit 上的滚动功能。在过去几个月里,我们一直在研究overscroll-behavior,并实现 scrollend 事件。
CSS 属性 overscroll-behavior,如您所知,设置了浏览器在到达滚动区域边界时执行的操作。它包括滚动链接、滚动拉伸、滑动手势等。为了修改默认边界操作,我们需要根据滚动类型和每个平台上可用的接口来处理它。例如,iOS 上异步滚动的滚动链接是在 UIScrollViews 内部处理的,我们无法从外部修改它。另一方面,Mac 有足够的接口供我们实现 overscroll-behavior。因此,我们决定从 Mac 开始。目前,我们已经发布了一个补丁来解析 overscroll-behavior 及其值,即从 CSS 到 WebKit 内部类型,如 CSSPropertyID。它受到实验性标志“CSS Overscroll Behavior”的保护。Mac 上同步滚动和异步滚动的 overscroll-behavior 原型已经完成。
正如您所预期的那样,scrollend 事件在滚动结束时触发。为了实现它,我们需要分别处理滚动类型,用户滚动、程序化滚动以及它们的组合。对于用户滚动和程序化滚动,scrollend 事件需要根据不同的计时器触发。对于它们的组合,用户滚动通常比程序化滚动具有更高的优先级,程序化滚动通常会被用户滚动取消或重写。为了避免混淆,只有用户发起的滚动才会触发 scrollend 事件。需要一个状态来指示用户滚动是否正在进行。然后,程序化滚动可以决定是否触发 scrollend 事件。由于 scrollend 事件是在主线程上触发的,因此我们需要考虑异步滚动的一致性,异步滚动在其他线程或进程上执行滚动。目前,我们已经完成了用户滚动和程序化滚动的 scrollend 事件触发原型的开发,支持同步和异步滚动。至于组合,我们目前正在开发一个补丁来收集用户滚动进行状态。
IntersectionObserver 和 ResizeObserver
自 2019 年以来,我们在 WebKit 中维护了 IntersectionObserver(在 iOS 12.2 中启用)和 ResizeObserver(在 iOS 14 测试版中启用)。正如预期的那样,在此期间报告了一些错误。一个这样的错误是关于 ResizeObserverCallback 内部的对象在页面重新加载之前被垃圾回收,如果 ResizeObserver 在 ResizeObserverCallback 内被引用。类似的错误发生在 IntersectionObserver 中。解决方案是将 ResizeObserverCallback 和 IntersectionObserverCallback 作为弱回调,并将它们添加到 JSResizeObserver 或 JSIntersectionObserver 的访问者中。修复此问题的补丁已经发布。
网络指标
由网络指标项目提供的性能指标对于网络开发人员来说也很重要,以确保他们能够量化其网站的用户体验并找到改进体验的具体方法。为事件计时创建了一个工作原型。不幸的是,在开始为事件计时发布补丁时,很明显该规范目前对于 Apple 来说是不可接受的。在处理相关标准时,进行了一些错误修复。
资源加载
延迟 iframe 加载已添加到规范中,并在WebKit中实现。延迟加载本身还需要一些错误修复,因此目前它仍在标志后面。
CSS aspect-ratio
10 月份,在 Webkit 中请求并获得了许可,允许我们处理 CSS aspect-ratio 功能,该功能允许设置纵横比,以允许元素自动调整大小,就像图像和其他元素已经自动执行此操作一样。在获得许可后不久,实现工作就开始了。取得了很大进展,预计这项功能的工作将在 2021 年第二季度完成。
下一步
上面重点介绍的工作将持续到 2021 年,下面重点介绍了 Igalia 将要参与的一些关键项目
- 我们将继续关注前面提到的滚动功能,例如 scrollend 事件、overscroll 行为和滚动行为。
- 作为对图像纵横比计算工作的一种延续,我们正在继续研究更通用的CSS aspect-ratio 属性。
- 我们将研究在 Safari 中实现CSS Containment。您的浏览器以 60fps 的速度呈现您使用 CSS 指定的所有内容所做的工作令人惊叹,考虑到存在的复杂关系。CSS Containment 属性允许作者提供谨慎的建议,通过隔离其样式、绘制和/或大小来限制这些关系。 这种建议允许渲染引擎显着优化渲染性能,因为它可以在 DOM 的较小区域上执行更有限的工作,而无需进行如此多的复杂交互。 CSS Containment L1 已在 Chrome 和 Firefox 中实现,但目前尚未在 WebKit 浏览器中实现。 这带来的性能提升本身就非常有价值,值得我们努力完成。 但是,一旦引擎中存在这种原始概念,那么潜在的可能性至少同样令人兴奋。 正在进行的容器查询规范和原型以及content-visibility等新想法需要 CSS Containment 中概述的概念。
我们的合作在网络公共领域取得了一些非常重要和富有成效的工作,我们热衷于继续合作,支持更强大的网络公共领域的更好共享体验。