广泛部署的技术
计时 API
页面可见性检测
用于确定是否正在显示网页的页面可见性API也可用于使资源的使用适应 Web 应用的需要,例如通过在页面最小化时减少网络活动。
本地优先级处理
后台任务协同调度规范定义了 requestIdleCallback
方法,该方法允许在应用未处理其他操作的下一个机会中调度操作。
底层字节码格式
WebAssembly 是一种低级别的字节码格式,它在网络浏览器中可以以接近本机的速度运行,并支持从C/C++和其他语言进行编译。它还定义了一个试图最大限度地提高性能的执行环境,并与 JavaScript 和 Web 进行良性合作,确保各种实现的安全性和行为一致性。
渲染性能
CSS 的 contain 属性可以指示某个元素的子树独立于页面的其余部分。这让用户代理能够进行大量优化,尤其是跳过屏幕外已知不会影响屏幕上内容呈现的部分。
动画优化
基于脚本的动画时间控制 API 可以帮助减少播放动画时的资源使用量。
滚动优化
平滑的滚动性能对于 Web 上出色的用户体验至关重要,尤其是在触屏设备上。通过事件监听器的 passive
选项,开发人员可以预先声明事件监听器不会在事件上调用preventDefault()
,从而允许浏览器在执行与事件相关的默认操作之前不同步等待。在触摸和滚轮事件中,这能够保证滚动的平滑性。注意:默认情况下,某些浏览器会自动在 touchstart
和 touchmove
上设置 passive
标志。
线程
除了优化资源之外,应用程序的感知反应性也是移动用户体验的一个关键方面。通过 Web Workers 实现的类似于线程的机制允许通过将最耗费资源的操作卸载到后台进程来保持用户界面的响应。
自动化
WebDriver规范定义了一个远程控制接口,可以实现外部对用户代理的控制,通常可用于跨多个浏览器(包括移动浏览器)的自动化测试。
优化最佳实践
移动 Web 应用最佳实践提供有关如何构建可在移动设备上良好运行的 Web 应用的通用建议,并特别考虑优化的需求。
开发中的技术
网络优先级
缓存
Service Workers 规范定义了一种机制,允许应用拦截传出的网络请求并直接对其进行响应。应用可以利用这种机制直接实现灵活的缓存逻辑,从而避免了对服务器的冗长请求。
电池状态
计时 API
渲染性能
为了应用的动画部分确保最佳的性能,Web 开发者可以使用 CSS 的 will-change
属性让浏览器在动画发生之前计算动画。
动画优化
CSS Animation Worklet API提供了一种使用 JavaScript 创建动画的方法。该API使用户代理可以在专用的线程中运行动画,降低主线程的压力。
无限滚动
在移动设备上使用无限滚动列表(在用户滚动时加载和呈现越来越多的内容)非常常见。这样的列表提供比触摸屏上的分页更好的用户体验。不幸的是,应用程序需要不断地同步轮询 DOM 元素的布局信息来实现这个模式,这是一个性能开销的重要来源。交叉观察器规范定义了一个 API,用于异步观察目标元素与祖先元素或顶层文档视图的交集中的变化,从而提供一种有效的机制来检索实现无限滚动所需的信息。
滚动优化
用户代理可以实现滚动的默认规则,例如滚动链和过度滚动,而 Web 应用可能希望禁用该规则以增强在移动设备上常见的拉动刷新和无限滚动等交互范例。这可以通过脚本来实现,但是由于应用需要监听触摸事件而不设置 passive
标志以在需要时覆盖默认行为,因此会对滚动性能产生负面影响。CSS 的 overscroll-behavior 属性在滚动到达边界时引入了对滚动容器行为的控制,允许 Web 应用禁用滚动的默认规则。
实时通讯
WebRTC统计信息API标识定义了一组 Web IDL 对象,允许访问有关 RTCPeerConnection 的统计信息,允许 Web 应用监视底层网络和媒体的性能。
探索性工作
计时 API
帧计时 API 旨在提供应用在用户设备上运行时获得的每秒帧数的详细信息。
事件计时 API使开发者能够衡量用户交互触发的某些事件的延迟。
元素计时 API 支持监视屏幕上显示大图片或开发者指定的图像元素和文本节点何时显示。
排版不稳定性 API 基于页面上降低用户体验的 HTML 元素的移动让 Web 开发者深入了解其网页的稳定性。
内存使用情况
performance.measureMemory API 提案可以估计网页的内存使用情况,并按类型(JavaScript、DOM、特定对象等)和所有者(URL)进行细分,以便 Web 开发者可以对其应用的内存使用情况进行统计分析,发现内存泄漏,并衡量应用功能对内存的影响。
网络优先级
优先级提示规范允许开发人员通知用户代理需要下载的每个资源的优先级,与现有的浏览器加载机制(如preload)互补。
DOM更新
Web 应用本质上是动态的,需要大量的 DOM 操作以呈现丰富的内容,而 DOM 的更新可能导致 jank(页面重绘时的明显延迟),因为渲染时用户交互和 requestAnimationFrame
造成的更新是同步。显示锁提议引入了一个新概念,使开发人员能锁定 DOM 元素及其子树,从而在 DOM 更新时阻止重绘。然后,开发者将能够以异步方式解锁元素,触发修改后子树的重绘,而不会导致页面的其余部分出现 jank。
类似地,一个添加 requestPostAnimationFrame
的早期提案提供了一个应用在渲染最后一帧之后的最早时间的钩子,从而使应用为下一次渲染更新做准备。该提案对于确保页面布局干净的时候运行代码也很有用,比如可以避免通过代码修改 CSS 属性然后查询元素的大小或位置时的同步布局。
JS 性能
Web 应用对 JavaScript 在客户端上的执行时间知道的的有限,而如果没有有效收集堆栈样本的能力,应用将被迫使用不精确的分析钩子来检测代码,并可能会显著减慢代码执行速度。JS Self-Profiling API 提议描述了一个用于操作抽样性能分析器的API,该分析器允许应用收集丰富的执行数据,以便以最小的开销收集和分析真实的最终用户环境。
反应性
需要运行长任务的应用(例如在加载页面时)需要在快速加载页面(或减少任务执行时间)与快速响应输入之间进行权衡。输入事件的早期检测规范提出了 isInputPending
方法,长时间运行的脚本可以同步调用,而不会浪费时间在其他脚本和事件处理上,以检测是否有未处理的输入事件,这些事件的执行可能会延迟触发。
需要运行长任务的应用可能还希望在事件循环之后重新获得控制,并且在其他相同或优先级较低的任务之前运行,scheduler.yield()
函数可以解决该问题。
一般而言,应用在计划任务优先级时几乎没有控制权。scheduler.postTask()
提案将创建一个统一的 API 来安排任务的优先级。
无限滚动
Web 平台孵化器社区组正在探索添加一个新的 <virtual-scroller>
元素,以避免使用纯 JavaScript 实现无限滚动。浏览器将优先渲染在视口(viewport)中的元素,而不是其他元素。这样能够提高性能,同时仍允许诸如查找、无障碍、导航焦点、片段 URL 导航等特性开箱即用。
特性 | 规范 / 小组 | 实现意向选择浏览器… |
---|---|---|
计时 API | 帧计时 (Frame Timing) Web 性能工作组 (Web Performance Working Group) | |
事件计时 API (Event Timing API) W3C | ||
元素计时 API (Element Timing API) Web 平台孵化社区组 (Web Platform Incubator Community Group) | ||
Layout Instability Web 平台孵化社区组 (Web Platform Incubator Community Group) | ||
内存使用情况 | performance.measureMemory API Web 平台孵化社区组 (Web Platform Incubator Community Group) | |
网络优先级 | 优先级提示 (Priority Hints) Web 平台孵化社区组 (Web Platform Incubator Community Group) | |
DOM更新 | 显示锁 (Display Locking) Web 平台孵化社区组 (Web Platform Incubator Community Group) | |
requestPostAnimationFrame Web 平台孵化社区组 (Web Platform Incubator Community Group) | ||
JS 性能 | JS Self-Profiling API Web 平台孵化社区组 (Web Platform Incubator Community Group) | |
反应性 | isInputPending Web 平台孵化社区组 (Web Platform Incubator Community Group) | |
Main-thread Scheduling API中的scheduler.yield() (scheduler.yield() in Main-thread Scheduling API) Web 平台孵化社区组 (Web Platform Incubator Community Group) | ||
Main-thread Scheduling API中的scheduler.postTask() (scheduler.postTask() in Main-thread Scheduling API) Web 平台孵化社区组 (Web Platform Incubator Community Group) | ||
无限滚动 | A built-in virtual scroller for the web platform Web 平台孵化社区组 (Web Platform Incubator Community Group) |