本周再来翻译一些技术文章,本次预计翻译三篇文章如下:
04.[译]使用Nuxt生成静态网站(Generate Static Websites with Nuxt)
05.[译]Web网页内容是如何影响电池功耗的(How Web Content Can Affect Power Usage)
06.[译]在现代JavaScript中编写异步任务(https://web.dev/off-main-thread/)
我翻译的技术文章都放在一个github仓库中,如果觉得有用请点击star收藏。我为什么要创建这个git仓库?目的是通过翻译国外的web相关的技术文章来学习和跟进web发展的新思想和新技术。git仓库地址:
用户将大部分的网络在线时间花费在移动设备上,其余的大部分是使用不受限制的便携式计算机。对于两者而言,电池寿命都是至关重要的。在这篇文章中,我们将讨论影响电池寿命的因素,以及你作为一名Web开发人员如何使你的页面更节能,以便用户可以花更多时间与你的内容互动。
什么消耗电量?移动设备上的大部分电量由这几个主要组件消耗:
CPU(主处理器)
GPU(图形处理)
联网(Wi-Fi和蜂窝无线芯片)
屏幕
屏幕功耗相对恒定,并且大多在用户的控制下(通过屏幕的开启时间和亮度),但是其他组件(CPU,GPU和网络硬件)在功耗方面具有很高的动态范围。
系统会根据当前正在处理的任务来调整CPU和GPU的性能,这些任务当然包括渲染用户正在使用其Web浏览器和其他使用Web内容的应用程序与之交互的网页。这可以通过打开或关闭某些组件并更改其时钟频率来完成。广义上讲,芯片要求的性能越高,其功率效率就越低。硬件可以非常快速地提升到高性能(但是要付出很高的功耗),然后可以迅速返回到更有效的低功耗状态。
良好用电的一般原则因此,为了最大程度地延长电池寿命,你需要减少在高功率状态下花费的时间,并使硬件尽可能多地回到空闲状态。
对于Web开发人员,需要考虑三种交互状态:
用户正在与内容进行交互时。
当页面位于最前面,但未与之交互时。
页面不是最前面的内容时。
高效的用户互动显然,在用户与页面进行交互时消耗电量是很正常的。你希望页面快速加载并快速响应触摸交互。在许多情况下,减少首次渲染时间和与用户互动的时间的相同优化也将减少功耗。但是,对于在初始页面加载后继续加载资源和运行脚本要谨慎。目标应该是尽快回到空闲状态。通常,运行的JavaScript越少,页面的效率就越高,因为脚本是在浏览器已经完成的布局和绘制页面的基础上工作的。
页面加载完成后,诸如滚动和点击之类的用户交互也将增加硬件功耗(主要是CPU和GPU),这再次有意义,但是请确保在用户停止交互后立即回到空闲状态。另外,请尝试停留在浏览器的“快速路径”上-例如,内置的页面滚动将比JavaScript中实现的自定义滚动更加节能。
将闲置电源使用率降至零当用户不与页面交互时,请尝试使页面使用尽可能少的电量。例如:
尽量减少使用计时器,以免唤醒CPU。尝试将基于计时器的工作合并为几个不经常使用的计时器。许多不协调的计时器会频繁的触发CPU唤醒,这比将工作收集成更少的块要糟糕得多。
尽量减少动画内容,例如动画图像和自动播放的视频。特别要避免“加载”GIF或CSS动画,这些GIF或CSS动画会不断触发绘制,即使你看不到它们也是如此。IntersectionObserver用于仅可在可见时运行动画。
尽可能使用声明性动画(CSS Animations和Transitions)。当动画内容不可见时,浏览器可以优化这些内容,并且它们比脚本驱动的动画更有效。
避免进行网络轮询以从服务器获取定期更新。推荐使用具有持久连接的WebSockets或Fetch,而不是轮询。
在应处于空闲状态时正在工作的页面也将对用户交互的响应降低,因此将后台活动最小化也可以提高响应速度和电池寿命。
后台时CPU使用率为零在多种情况下,页面变为非活动状态(不是用户的焦点时),例如:
用户切换到其他选项卡。
用户切换到其他应用程序。
浏览器窗口最小化。
浏览器窗口是可见的,但不是焦点窗口。
浏览器窗口在另一个窗口后面。
窗口所在的空间不是当前空间。
当页面变为非活动状态时,WebKit会自动采取动作来节省电量:
requestAnimationFrame 已停止。
CSS和SVG动画已暂停。
计时器受到限制。
另外,WebKit会利用操作系统提供的功能来最大化效率:
在iOS上,如果可能,选项卡将完全挂起。
在macOS上,标签页会进入App Nap,这意味着未进行视觉更新的标签页的Web进程的优先级较低,并且计时器受到限制。
但是,页面可以通过计时器(setTimeout和setInterval),消息,网络事件等触发CPU唤醒。在后台时,应尽可能避免这些事件。有两个对此有用的API: