You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
DNS(Domain Name System):域名系统,域名和 IP 地址相互映射的一个分布式数据库。
DNS Prefetching
浏览器会根据自定义的规则,先提前去解析后面可能会使用到的域名,提前解析,不需要等到要去加载资源的时候再去解析。默认的情况下,网页里的 a 标签里的href属性带的域名会自动去启用DNS Prefetching(不需要在 link 里手动设置),HTTPS 下该默认规则无效。HTTPS 下可以在 meta 标签上操作
性能领域的术语概念
F:first 的缩写 ,意思第一次
P: paint 的缩写,意思为绘制
C:contentful,意思为内容
FP(First Paint):首次绘制,页面在屏幕上首次发生视觉上变化的事件
FCP(First Contentful Paint):首次内容绘制,浏览器第一次在屏幕上渲染内容
FMP(First Meaniful Paint):首次有效绘制,表示页面的 “主要内容” 开始出现在屏幕上的时间点,该指标是测量用户加载体验的主要指标
LCP(Large Contentful Paint):表示可视区域中 内容 最大的可见元素开始出现在屏幕上的时间点
TTI(Time To Interactive):可交互时间,网页中第一次 完全达到可交互状态 的时间点。主线程的任务均不超过 50 毫秒(time slicing)。
TTFB(Time To First Byte):浏览器接受第一个字节时间
FCI(First CPU Idle):CPU 第一次空闲的时间,CPU空闲,说明主线程已经空闲下来了,此时就可以接受用户的响应了
FID(First Input Delay):首次输入延迟,可在TTI前开始与网页产生交互,也可能在TTI之后才与网页产生交互
可在 head 标签里注册一个事件(click、mousedown、keydown、touchstart、pointerdown),事件响应函数中使用当前时间减去时间对象被创建的时间
FP与FCP 的区别
关键资源:阻塞网页首次渲染的资源(FP)
DOM的生命周期
如果没有解析器阻塞 JavaScript,DOMContentLoaded 事件会在 domInteractive 之后立即执行,defer 延迟的脚本就会阻塞
大多 JavaScript 框架 会在执行自己的逻辑前等待这个事件的触发
前端流程
下面的流程就是前端的基本流程,根据这个流程,我们可以看看每一个阶段都可以做哪些性能优化
导致性能低的原因
解决方案
1.打包构建
1.1 预编译
类似vue,最终都是将tempalte编译成render 函数,预编译就可以省去在运行时才将template 编译成render函数
tree-shaking,在构建过程中,清楚无用代码,可以减少构建后文件的体积
1.2 code Spliting
两种方式:
// 在webpack 配置文件里面配置
1.3 import 按需加载
1.4 ssr 渲染 ? dll?
2.浏览器缓存
浏览器缓存:通过 HTTP 请求获取到的资源缓存在浏览器,分为强缓存、协商缓存;这是一个递进关系,先强缓存,缓存不命中再到协商缓存。
HTTP 1.0
HTTP 1.1
详情可看我另一篇文章:浏览器缓存
3.DNS
DNS(Domain Name System):域名系统,域名和 IP 地址相互映射的一个分布式数据库。
DNS Prefetching
浏览器会根据自定义的规则,先提前去解析后面可能会使用到的域名,提前解析,不需要等到要去加载资源的时候再去解析。默认的情况下,网页里的 a 标签里的href属性带的域名会自动去启用DNS Prefetching(不需要在 link 里手动设置),HTTPS 下该默认规则无效。HTTPS 下可以在 meta 标签上操作
注意
4.HTTP
当强缓存没有命中的时候,就要去服务端获取数据。一个TCP连接下,(chrome下)同个域名的HTTP请求最大并发连接数是6个,多处的请求需要排队等候;其它的浏览器也都有限制。
有一个衡量网络性能的指标,RTT(Round Trip Time),客户端到服务端的往返时延,从发送端发送数据开始,到发送端收到来自接收端的确认,总共的耗时;TCP的传输大小也是有限制,一个RRT只能传输14KB的资源,对此我们要对这个RTT进行优化。
这个阶段从三个点来优化:
如何减少关键资源的个数
如何减少关键资源的大小
如何减少RTT的次数
影响 RTT 的因素,就是资源大小,资源数量,所以方式就是使用上面的两种方式结合。
3.CDN
CDN(Content Delivery Network):内容分发网络,由分布在不同地理位置的 Web 服务器组成。当服务器的地理位置距离我们越远,那传播的延迟就越高;而 CDN 就是让服务器距离客户端更近。
GLSB(全局负载均衡系统):
SLB(本地负载均衡系统):
使用了 CDN 作为缓存的流程:
4. 加载解析主要资源角度
当我们去把服务端里的数据请求回来以后,就需要进行 HTML 解析,加载关键资源(JS、CSS),我们来看看 JS 是如何影响DOM生成的。正常来说JavaScript文件的下载是同步的,会阻塞DOM的解析;chrome 在这里做了很多优化,在这里会开启预解析操作,当渲染引擎接受到字节流以后,就会开启一个预解析线程去分析HTML中包含的JS、CSS 文件,当解析到相关文件以后,就会提前下载这些文件。
由于JavaScript线程会阻塞DOM,可采纳以下策略进行相关优化:
上面的优化是从文件加载的角度来看的,下面是从JS文件执行的角度来优化。
5.主动交互角度
长任务:主动交互的角度是从 TTI 开始,就是主要是保证用户在做交互的时候要保证流畅,不要长时间的占用主线程(尽量保证任务的执行时间小于50ms)。
两种技术方案:
5.1 Web Worker
相当于是开启了一个新的线程,把需要循环的任务放在当中执行,这样就不会占用主线层,缺点是无法操作 DOM
5.2 Time Slicing
Time Slicing 就是把一个长任务切割成多个执行时间短的任务,
核心的实现是调用 setTimeout 会将任务添加到宏任务中、yield 的可以暂停执行
6. 数据读取
6. DOM
8. 流程控制
The text was updated successfully, but these errors were encountered: