We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
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
title: 【笔记】- 浏览器渲染原理与性能优化总结 date: 2021-04-03 tags:
HTML
CSS
JS
3d
如果输入的是关键字那么会调用默认的搜索引擎,否则如果是合法url,则开始以下步骤
粗略得讲总共4步,可以说是浏览器几个进程之间的互相协作过程,进程间通信用IPC:
网络的七(四)层模型: (物 数) (网ip)(传tcp 安全可靠 分段传输/udp 会丢包速度快不需要握手) (会 表 应)
HTTPS
SSL
TCP
IP
HTTP 1.1
keep-alive
Queuing
Stalled
DNS lookup
DNS
initial Connection
Request Sent
Waiting
TTFB
Content Dowloaded
css如果放在底部,那么有可能会发生重绘,因为当html渲染时,渲染从上到下,边解析边渲染(没有样式的前提下),在还没解析到css部分的时候就已经把之前的dom部分渲染好了,此时再加载css,就会对dom进行二次渲染。相反,如果把css放在头部,当渲染dom时,是必须要等待样式加载完毕才会渲染,所以说css的资源加载不会阻塞HTML的解析,但是会阻塞dom的渲染
JavaScript会阻塞HTML的解析,也会阻塞dom的渲染,如果把js放在文件的头部或中间,就会把整个渲染过程割裂开,当解析到js部分时就必须先执行js,然后再执行后续的解析。 同时css的加载会阻塞js的执行,因为js要保证能够操作页面样式时才开始执行。js为什么会阻塞dom渲染,因为js也是可以操作dom的,如果页面渲染和js并行,那么js就有可能操作到不符合预期的dom了
总结为下图,主流程就是下图的第一行,浏览器会预解析HTML文件,看里面有没有css和js的外链,然后并发去请求,当返回后,dom的渲染依赖js的执行完毕,而js的执行开始依赖于css的解析完毕
time to first byte
TTI
Time to Interactive
DCL
DOMContentLoaded
L
onLoad
FP
First Paint
FCP
First Contentful Paint
FMP
First Meaningful paint
LCP
Largest Contentful Paint
viewport
FID
First Input Delay
// 如何计算 <script> window.onload = function () { let ele = document.createElement('h1'); ele.innerHTML = 'zf'; document.body.appendChild(ele) } setTimeout(() => { const { fetchStart, // 开始访问 requestStart, // 请求开始 responseStart, // 响应开始 domInteractive, // dom交互的时间点 domContentLoadedEventEnd, // dom加载完毕 + domcontentloader完成的时间 loadEventStart // 所有资源加载完毕 } = performance.timing; let TTFB = responseStart - requestStart; // ttfb let TTI = domInteractive - fetchStart; // tti let DCL = domContentLoadedEventEnd - fetchStart // dcl let L = loadEventStart - fetchStart; console.log(TTFB, TTI, DCL, L) const paint = performance.getEntriesByType('paint'); const FP = paint[0].startTime; const FCP = paint[1].startTime; // 2s~4s }, 2000); let FMP; new PerformanceObserver((entryList, observer) => { let entries = entryList.getEntries(); FMP = entries[0]; observer.disconnect(); console.log(FMP) }).observe({ entryTypes: ['element'] }); let LCP; new PerformanceObserver((entryList, observer) => { let entries = entryList.getEntries(); LCP = entries[entries.length - 1]; observer.disconnect(); console.log(LCP); // 2.5s-4s }).observe({ entryTypes: ['largest-contentful-paint'] }); let FID; new PerformanceObserver((entryList, observer) => { let firstInput = entryList.getEntries()[0]; if (firstInput) { FID = firstInput.processingStart - firstInput.startTime; observer.disconnect(); console.log(FID) } }).observe({ type: 'first-input', buffered: true }); </script>
dns-prefetch
gzip
// Content-Encoding: gzip
<link rel="preload" href="style.css" as="style"> // as表示优先级
避免空src的图片,空src也会发送请求
减小图片尺寸,减少流量
设置alt,提升体验
图片懒加载 loading:lazy,只有进入到可视区域才会加载
loading:lazy
<img loading="lazy" src="./images/1.jpg" width="300" height="450" />
定好图片的宽高,就不用让浏览器计算
采用base64减少请求
The text was updated successfully, but these errors were encountered:
No branches or pull requests
title: 【笔记】- 浏览器渲染原理与性能优化总结
date: 2021-04-03
tags:
categories:
进程与线程
浏览器中的五个进程
HTML
、CSS
,、JS
等)3d
绘制,提高性能从输入URL到浏览器显示页面发生了什么?
如果输入的是关键字那么会调用默认的搜索引擎,否则如果是合法url,则开始以下步骤
粗略得讲总共4步,可以说是浏览器几个进程之间的互相协作过程,进程间通信用IPC:
网络的七(四)层模型: (物 数) (网ip)(传tcp 安全可靠 分段传输/udp 会丢包速度快不需要握手) (会 表 应)
URL请求过程
HTTPS
,那要做SSL
的协商TCP
头部,IP
头部)HTTP 1.1
中支持keep-alive
属性,TCP链接不会立即关闭,后续请求可以省去建立链接时间。如何看network timing
Queuing
: 请求发送前会根据优先级进行排队,同时每个域名最多处理6个TCP链接,超过的就会进行排队,并且分配磁盘空间时也会消耗一定时间。Stalled
:请求发出前的等待时间(处理代理,链接复用)DNS lookup
:查找DNS
的时间initial Connection
:建立TCP链接时间SSL
:SSL
握手时间(SSL
协商)Request Sent
:请求发送时间(可忽略)Waiting
(TTFB
) :等待响应的时间,等待返回首个字符的时间Content Dowloaded
:用于下载响应的时间HTTP的发展历程
为什么css放在header里,js要放在底部?
css如果放在底部,那么有可能会发生重绘,因为当html渲染时,渲染从上到下,边解析边渲染(没有样式的前提下),在还没解析到css部分的时候就已经把之前的dom部分渲染好了,此时再加载css,就会对dom进行二次渲染。相反,如果把css放在头部,当渲染dom时,是必须要等待样式加载完毕才会渲染,所以说css的资源加载不会阻塞HTML的解析,但是会阻塞dom的渲染
JavaScript会阻塞HTML的解析,也会阻塞dom的渲染,如果把js放在文件的头部或中间,就会把整个渲染过程割裂开,当解析到js部分时就必须先执行js,然后再执行后续的解析。 同时css的加载会阻塞js的执行,因为js要保证能够操作页面样式时才开始执行。js为什么会阻塞dom渲染,因为js也是可以操作dom的,如果页面渲染和js并行,那么js就有可能操作到不符合预期的dom了
总结为下图,主流程就是下图的第一行,浏览器会预解析HTML文件,看里面有没有css和js的外链,然后并发去请求,当返回后,dom的渲染依赖js的执行完毕,而js的执行开始依赖于css的解析完毕
渲染流程
Perfomance API
TTFB
time to first byte
(首字节时间)TTI
Time to Interactive
(可交互时间)DCL
DOMContentLoaded
(事件耗时)DOMContentLoaded
事件被触发L
onLoad
(事件耗时)FP
First Paint
(首次绘制)FCP
First Contentful Paint
(首次内容绘制)FMP
First Meaningful paint
(首次有意义绘制)LCP
Largest Contentful Paint
(最大内容渲染)viewport
中最大的页面元素加载的时间FID
First Input Delay
(首次输入延迟)网络优化
JS
、CSS
,合理内嵌CSS
、JS
,所谓合理就是不能全部内联,那样就无法做资源缓存了dns-prefetch
,做DNS预解析gzip
压缩优化,主要针对html,js,css,一般不包含图片,因为图片已经压缩了,可能压缩后更大// Content-Encoding: gzip
关键路径渲染
静态文件优化
图片优化
图片格式
图片优化
避免空src的图片,空src也会发送请求
减小图片尺寸,减少流量
设置alt,提升体验
图片懒加载
loading:lazy
,只有进入到可视区域才会加载定好图片的宽高,就不用让浏览器计算
采用base64减少请求
CSS优化
JS优化
优化策略
The text was updated successfully, but these errors were encountered: