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
// 浏览器做优化,将多次reflow减少为少量的reflow
document.addEventListener('DOMContentLoaded', function () {
var date = new Date();
for (var i = 0; i < 70000; i++) {
var tmpNode = document.createElement("div");
tmpNode.innerHTML = "test" + i;
document.body.appendChild(tmpNode);
}
console.log(new Date() - date);
});
当我们了解浏览器的渲染过程、渲染原理、其实就是掌握了核心,根据优化原则,可以实现出无数种具体的优化方案,各种功能预编译、预加载、资源合并、按需加载方案都是针对浏览器渲染习惯的优化。
输入一个Url经过哪些步骤
浏览器渲染页面流程
<script>
且没有defer
或async
属性的标签时,会触发页面渲染(构建出rendering tree
),因而如果前面CSS
资源尚未加载完毕时,浏览器会等待它加载完毕再执行脚本。所以这时候CSSOM
会阻塞javascript
的执行,javascript
执行会阻塞DOM
的构建常见的优化手段
为什么js放到body最后、css放到head中比较好?
同时将js 和 css放置在一起的时候,js在前面,性能好点为什么
reflow(回流)和repaint(重绘)两个过程
reflow/layout过程
可以通过下面这几种方法进行触发
width
,height
,margin
,display
,border
,etctop
,position
,float
,etc
text-align
,overflow
,font-size
,line-height
,vertival-align
,etcoffsetWidth
、offsetHeight
、clientWidth
、clientHeight
、width
、height
、scrollTop
、scrollHeight
浏览器中的执行过程
Recalculate Style
:浏览器计算改变过后的样式Layout
:这个过程就是我们说得reflow回流过程Update Layer Tree
:更新Layer TreePaint
:图层的绘制过程Composite Layers
:合并多个图层repaint过程
触发的方法如下:
background
,color
,cursor
,visibility
,etc浏览器执行过程如下:
Recalculate Style
:浏览器计算改变过后的样式Update Layer Tree
:更新Layer TreePaint
:图层的绘制过程Composite Layers
:合并多个图层浏览器对于reflow的优化
offsetTop
/Left
/Width
/Height
scrollTop
/Left
/Width
/Height
clientTop
/Left
/Width
/Height
getComputedStyle()
, orcurrentStyle
in IE例如可通过下面两种方式进行测试
避免reflow和repaint带来的性能开销
css层面避免回流、重绘
javascript层面上避免回流、重绘
defer和async
defer
表示延迟执行引入的javascript
,即就是dom解析到defer
属性的script
脚本,不会停止解析,等到整个dom解析完毕后,按照defer-script顺序执行,执行完毕后触发DOMContentLoaded
事件,但是网上有一种声音说的是:由于浏览器实现标准的不同,使用defer不一定能够保证脚本一定按照顺序执行,async
表示异步执行引入的script
,与defer
的区别在于,如果已经加载好,就会开始执行——无论此刻是 HTML 解析阶段还是DOMContentLoaded
触发之后。需要注意的是,这种方式加载的JavaScript
依然会阻塞 load 事件。换句话说,async-script
可能在DOMContentLoaded
触发之前或之后执行,一定在 load 触发之前执行。这也就是自己这次遇见的问题,最终发现通过这种方式创建的
script
默认是异步的,所以来讲,动态创建的script
是不会阻塞页面的,如果想要同步进行执行可以将async
设置为false
,如果使用这种方法创建link
标签的话,实际测试chrome
是不会阻塞渲染的。页面渲染触发的事件
DOM API的事件
DOMContentLoaded
load
readystatechange
beforeunload
unload
页面加载中的时间点
domLoading
:这是整个过程的起始时间戳,浏览器即将开始解析第一批收到的 HTML 文档字节。domInteractive
:表示浏览器完成对所有 HTML 的解析并且 DOM 构建完成的时间点。domContentLoaded
:表示 DOM 准备就绪并且没有样式表阻止 JavaScript 执行的时间点,这意味着现在我们可以构建渲染树了。domComplete
:顾名思义,所有处理完成,并且网页上的所有资源(图像等)都已下载完毕,也就是说,加载转环已停止旋转。loadEvent
:作为每个网页加载的最后一步,浏览器会触发 onload 事件,以便触发额外的应用逻辑。HTML 规范中规定了每个事件的具体条件:应在何时触发、应满足什么条件等等。对我们而言,我们将重点放在与关键渲染路径有关的几个关键里程碑上:
domInteractive
表示 DOM 准备就绪的时间点。domContentLoaded
一般表示 DOM 和 CSSOM 均准备就绪的时间点。如果没有阻塞解析器的JavaScript
,则DOMContentLoaded
将在domInteractive
后立即触发。domComplete
表示网页及其所有子资源都准备就绪的时间点。参考
The text was updated successfully, but these errors were encountered: