-
Notifications
You must be signed in to change notification settings - Fork 4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
前端性能相关 #5
Comments
1.性能优化 (RAIL模型)
使用RAIL模型评估性能:
1.1响应在100ms内响应用户操作,他们会觉得可以立即获得结果。时间再长,操作与反应之间的连接就会中断。对于需要超过 500 毫秒才能完成的操作,始终提供反馈。 1.2动画(渲染性能)目前大多数设备的屏幕刷新率为60Hz,所以尽可能使动画保持60fps。由于浏览器有整理工作要做,因此每一帧的工作需要在 10 毫秒内完成。
1.3空闲用户没有与页面交互,但主线程应足够用于处理下一个用户输入。如果用户开始交互,优先级最高的事项是响应用户。例如,往页面里插入10,000个dom,如果直接插入,势必造成主线程阻塞、页面假死,要实现小于 100 毫秒的响应,应用必须在每 50 毫秒内将控制返回给主线程,可以每隔50ms插入100个dom,既可以完成任务,又能确保即时的响应。 1.4加载(关键渲染路径)为了尽快完成关键渲染路径,应当最大限度减小三种可变元素:关键资源的数量、大小,关键路径长度。具体如下:
|
白屏问题(优化关键渲染路径)分析:白屏时间内发生了什么?
从以下维度去优化
|
JavaScript 动画和 CSS 动画该如果抉择动画优化思路
所以,在实现一些小的交互动效的时候,就多考虑考虑 CSS 动画。对于一些复杂控制的动画,使用 javascript 比较可靠。 |
webpack构建优化
webpack 流程 |
CLS 优化偏移基本上都是发生了 re-layout,所以这个问题跟 layout 有很大的相关性
|
常见的性能指标
TTFB(全称“Time to First Byte”)
表示浏览器接收第一个字节的时间
performance.getEntriesByType('navigation')
responseStart - fetchStart
DCL
表示 DomContentloaded 事件触发的时间。
performance.getEntriesByType('navigation')
domContentLoadedEventEnd - fetchStart
L
表示 onLoad 事件触发的时间。
DomContentloaded 事件与 onLoad 事件的区别是,浏览器解析 HTML 这个操作完成后立刻触发 DomContentloaded 事件,而只有页面所有资源都加载完毕后(比如图片,CSS),才会触发 onLoad 事件。
performance.getEntriesByType('navigation')
loadEventStart - fetchStart
FP(全称“First Paint”,翻译为“首次绘制”)
是时间线上的第一个“时间点”,它代表浏览器第一次向屏幕传输像素的时间,也就是页面在屏幕上首次发生视觉变化的时间。
performance.getEntriesByName('first-paint')
FCP(全称“First Contentful Paint”,翻译为“首次内容绘制”)
顾名思义,它代表浏览器第一次向屏幕绘制 “内容”(文本,图片,SVG,canvas 元素等)
performance.getEntriesByName('first-contentful-paint')
FMP(全称“First Meaningful Paint”,翻译为“首次有效绘制”)
表示页面的“主要内容”开始出现在屏幕上的时间点。它是我们测量用户加载体验的主要指标。
LCP(全称“Largest Contentful Paint”)
表示可视区“内容”最大的可见元素开始出现在屏幕上的时间点。
了解和测量网站真实的性能其实非常困难,像 load 和 DOMContentLoaded 不会告诉我们用户什么时候可以在屏幕上看到内容。而 FP 和 FCP 又只能捕获整个渲染过程的最开始,FMP 更好一点,但是它的算法比较复杂,而且有时候不准。FP 与 FCP 可以让我们知道,我们的产品何时开始渲染;而 FMP 与 LCP 可以让我们了解我们的产品何时“有用”,站在用户的角度,FMP 与 LCP 可以表示我们的产品需要多久才能体现出价值。
注意,这里说的是“有用”,而不是“能用”;那我们如何才能知道我们的产品什么时候“能用”呢?这就需要另一个性能指标“TTI”了。
TTI(全称“Time to Interactive”,翻译为“可交互时间”)
表示网页第一次 完全达到可交互状态 的时间点。可交互状态指的是页面上的 UI 组件是可以交互的(可以响应按钮的点击或在文本框输入文字等),不仅如此,此时主线程已经达到“流畅”的程度,主线程的任务均不超过 50 毫秒。TTI 很重要,因为 TTI 可以让我们了解我们的产品需要多久可以真正达到“可用”的状态。DCL 之后理论上可交互了,但如果此时又执行了 LongTask,页面又卡死了,所以 DCL 并不能代表真实的“可用”状态。
FCI(全称“First CPU Idle”)
是对 TTI 的一种补充,TTI 可以告诉我们页面什么时候完全达到可用,但是我们不知道浏览器第一次可以响应用户输入是什么时候。我们不知道网页的“最小可交互时间”是多少,最小可交互时间是说网页的首屏已经达到了可交互的状态了,但整个页面可能还没达到。从名字也可以看出这个指标的意思,第一次 CPU 空闲,主线程空闲就代表可以接收用户的响应了。
FID(First Input Delay)
第一输入延迟。衡量交互性,小于 100ms 为佳。
performance.now() - event.timeStamp;
TBT (Total Blocking Time)
总阻塞时间(TBT)指标衡量了从第一次有内容的绘画(FCP)到交互时间(TTI)之间的,主线程被阻塞到足以阻止输入响应性的总阻塞时间。
CLS (Cumulative Layout Shift)
累计布局偏移(CLS)是一个重要的、以用户为中心的衡量视觉稳定性的指标,因为它有助于量化用户经历意外布局偏移的频率 --较低的 CLS 有助于确保页面令人愉悦。
CLS=影响分数✕距离分数
75%✕25%=0.1875
The text was updated successfully, but these errors were encountered: