美文网首页小叶同学实践手册
前端性能优化 - 首屏渲染优化实现及其必要性

前端性能优化 - 首屏渲染优化实现及其必要性

作者: 叶叶叶同学 | 来源:发表于2020-10-15 08:16 被阅读0次

前端性能优化,不得不提的就是这个首屏渲染优化

首屏渲染优化

其实更具体点,应该是:首次加载首屏渲染优化,原因是某些应用,比如微信有缓存机制,首次加载了,第二次进入都会先加载本地缓存。

言归正传,首屏渲染加载优化,其实通俗说起来就是:“刚进页面加载快点”。其实这话也很笼统,专业点来说,其实是有如下几个指标的:

  • FP(全称“First Paint”,翻译为“首次绘制”)
  • FCP(全称“First Contentful Paint”,翻译为“首次内容绘制”)
  • FMP(全称“First Meaningful Paint”,翻译为“首次有效绘制”)
  • LCP(全称“Largest Contentful Paint”) 表示可视区“内容”最大的可见元素开始出现在屏幕上的时间点。
  • TTI(全称“Time to Interactive”,翻译为“可交互时间”) 表示网页第一次 完全达到可交互状态

有点专业,但其实配合英文也是挺好理解的

优化首屏渲染不外乎几个思考点:

  • 减少首屏渲染的体积大小,尤其是SPA应用,不加处理往往体积都会比较大
  • 减少首屏渲染从开始到可交互的时间
  • 从开始到可交互的时间里,其实dom已经加载了,在这里可以进行一些UI上的渲染,让客户看得到页面变化,让客户感知到确实网站是在加载中的

第一二点在我的其他文章有详细赘述了基本的实现方案,不外乎是:nginx服务器配置、代码级别的优化比如代码分片、懒加载、CDN等

这里想主要讲的是第三点,即实现用户感知上的优化,从空白到有正确元素渲染的时间

现状

一般的SPA,从技术上决定了不加任何处理的情况下,现状是:

  • FP到LCP,为首屏空白
  • LCP到TTI,由于基本采用异步交互形式,此时页面基本会已经加载好了页面的所有元素

所以了,优化用户感知上的体验,这里主要是探讨

FP到LCP的这个短短的时间,虽然短,但是优化后,体验感知会更优(起码不是白屏一大段时间了吧,虽然实际上正常情况下,最多也才0.5s左右)

First Paint 到 Largest Contentful Paint

题外话
其实,基本上参考我之前的文章实现Nginx,懒加载/代码分片,CDN后,light house评分基本都能到90以上

Light House评分
而这里要探究的,是即使在这基础上,再次进行体验的优化,也就是所谓的"1s甚至更短时间"之内的事情

First Paint - First Contentful Paint

要处理这一部分,就需要理解一个前置背景知识

无论是Vue还是React,在脚手架搭建起来后,都是mount在html某个DOM上,以React 为例子:
create-react-app构建的项目public目录里的index.html会是这样的

<body>
 <div id="root"></div>
</body>

实际上项目里的index.js也是挂载在这个root元素上,也就意味着当该页面正确挂载所有js之前,都是渲染的空<div id="root"></div>html页面

有了上述的前置知识,是不是有想法了大家,其实说来也简单,就是在FP之前的事情我们决定不了(一定程度上,就是服务器加载基本html的速度)而FP之后到FCP之间这段时间,我们可以通过一些方法来展示内容给用户

比如,京东的H5,淘宝H5,知乎H5,都有对应初次loading的动画,一般是自家的Icon,有兴趣的话,网购的时候自己留意下

数据说话


image.png

如上图,约224ms左右,完成html资源的加载,相当于用户只等待了0.224s就看到页面有反应了,且此时的样子,是可以作为一个挺好的“广告时间”,比如加上自己家的logo等

如果有杠精说这个0.224s优化,那我就只能说:是不是值得投入人力物力去优化这个0.224s了,毕竟这涉及到DNS解析,网站服务器响应,网络路由等问题了

0.224s之前是白屏


0.224s之前.png

0.224s之后是预加载动画


0.224s之后.png

First Contentful Paint - Largest Contentful Paint

接下来就是FCP到LCP部分了,有一些聪明又爱偷懒的小伙伴肯定会想:其实就保持FP的预加载动画直到LCP就好啦。

说实话是可以的哈,但既然是在谈优化,就看“感知上”能怎么优化到最好吧。

之前有提到“代码分片/懒加载",其实可以做到:

预加载动画 --> 分片加载的suspend动画 --> LCP

此时当首屏加载的时候,会先加载预加载动画,然后加载代码分片的suspend动画,最后渲染真实需要的DOM

  • 优势在于,在弱网环境下,用户可以感知得到页面在加载中而不是一个动画一直在load,安抚用户

分片加载的suspend动画一般可以用骨架屏来实现

224ms前
224ms后
793ms后
990ms后

即:0.2s白屏 -> 0.6s预加载动画 -> 0.2s代码分片骨架屏动画,就完成了LCP

一份 Akamai 的研究报告,当时总共采访了大约 1048 名网上购物者,得出了这样的结论:

  • 大约有 47% 的用户期望他们的页面在两秒之内加载完成。
  • 如果页面加载时间超过 3s,大约有 40% 的用户选择离开或关闭页面。

回过头来看看我们的结果

如果不加预加载动画、分片代码骨架屏动画,从进入页面到展示内容,归总花了1s左右客户才能看到页面从白屏到有内容

加入后,只花了0.2s客户就看到页面有内容展示了(当然具体情况要看现实条件,此处为同一情况下浏览器实践数据)

相关文章

  • 前端性能优化 - 首屏渲染优化实现及其必要性

    前端性能优化,不得不提的就是这个首屏渲染优化 首屏渲染优化 其实更具体点,应该是:首次加载首屏渲染优化,原因是某些...

  • 移动web相关(二)

    首屏优化 前端性能 我们所说的前端性能一般包括:加载性能;渲染速度;用户交互响应速度;动画流畅性;DOM操作无闪动...

  • Cocos Creator 微信小游戏平台启动与包体优化(首屏渲

    0.小游戏平台与启动加载/首屏渲染 如果不了解首屏渲染是什么,以下是官方文档和一篇优化帖子: 微信官方性能优化指南...

  • 前端性能优化(中)

    性能优化调研系列文章 《前端性能优化(上)》 《前端性能优化(中)》 《前端性能优化(下)》 《前端性能优化(上)...

  • 前端性能优化(下)

    性能优化调研系列文章 《前端性能优化(上)》 《前端性能优化(中)》 《前端性能优化(下)》 《前端性能优化(中)...

  • iOS性能优化涉及方面总结

    性能优化:界面卡顿优化:1、减少离屏渲染,造成离屏渲染的有shouldRasterize(光栅化)、mask(遮罩...

  • 前端性能优化-开篇

    前端性能优化问题是每个前端需要掌握的技术。这篇文章从渲染优化、代码优化、资源优化、构建优化、传输加载优化、更多流行...

  • iOS 性能优化二

    主要讲解界面卡顿原因/优化方案/离屏渲染 iOS 性能优化一iOS 性能优化二iOS 性能优化三 1. 开发中遇到...

  • 前端性能优化(上)

    性能优化调研系列文章 《前端性能优化(上)》 《前端性能优化(中)》 《前端性能优化(下)》 为什么要进行前端性能...

  • iOS-从UIImage渲染模式到UI渲染性能优化

    关键词: imageWithRenderingMode渲染模式 UI渲染性能优化、离屏渲染、Color Blend...

网友评论

    本文标题:前端性能优化 - 首屏渲染优化实现及其必要性

    本文链接:https://www.haomeiwen.com/subject/gufwpktx.html