最近面试经常问:重排重绘怎么理解?我发现很多考生没有回答重点。在哪里看过相关的文章,听上去很零散,不合逻辑。错误演示一般面试流程是这样的:面试官:你怎么理解rearrangement和redrawing?考生:重排是指当页面的结构发生变化时,会重新排列,比如改变字体大小,增加或删除DOM元素等。重绘是指页面结构没有改变,只是外观发生了变化,比如改变了字体颜色、背景颜色等。只会重绘。当然,他说的对,我也不能直接说他不对,我就继续指导。采访者:重排和重画有关系吗?考生:重排一定会重绘,重绘不一定会重排。采访者:为什么?考生:因为重排结构变了,肯定会导致重绘。我这时候的表情是这样的:如果你觉得上面的答案是对的,那你一定要好好看看下面的。一般不会直接跳过,会要求浏览器重新引导关键的渲染路径。不知道的我再指导一遍(其实这时候我已经基本放弃了)。你知道当浏览器加载HTML时会发生什么吗?如果您仍然不知道,那么该是下一个问题的时候了。如果你知道关键的渲染路径,你仍然可以通过基本指南来理解它。如果你不知道,你一定不了解重排和重绘。对于这个问题,我一般考察两点:浏览器的关键渲染路径。如果上面这个你都答不上来,一般这个问题都是冷的。性能优化,如果减少重绘和回流,当然这一点也必须建立在对关键渲染路径的理解上(这不是重点)。复习复习的目的是想知道考点是什么,简单的给大家复习一下。希望更详细的内容按照我介绍的知识点进行(深入学习可以阅读文末推荐的文章)。毕竟复习不是上课。《我们可能知道可以通过编写HTML、CSS和JavaScript将页面渲染到屏幕上,但是浏览器是如何将我们的代码渲染到屏幕上的像素点上的呢?这就需要理解这样一个概念CRP:CriticalRenderingPath(关键渲染路径)RenderingPath)是浏览器将HTML、CSS、JavaScript转换为屏幕像素的一系列步骤。优化关键渲染路径可以提高渲染性能。一般步骤如下:在解析HTML时,将创建DOM,HTML可以请求JavaScript,而JavaScript反过来可以更改DOM。HTML包含或请求样式,进而构建CSSOM。浏览器引擎将两者结合起来创建渲染树,布局决定了页面上所有内容的大小和位置,一旦布局确定,像素就会被绘制到屏幕上。优化关键渲染路径可以减少首次渲染的时间。了解和优化关键渲染路径对于确保回流和重绘能够以每秒60帧的速度进行以确保高效的用户交互并避免烦人的伪影非常重要。接下来研究详细过程:Step1.GenerateDOMDOM构建是增量式的。浏览器从远程下载Byte=>根据对应的编码(如utf8)转成字符串=>通过AST解析成Token=>生成Node=>生成DOM。单个DOM节点以startTag标记开始,以endTag标记结束。节点包含有关HTML元素的所有相关信息。此信息使用令牌进行描述。节点根据令牌层次结构连接到DOM树中。如果另一组startTag和endTag标记位于一组startTag和endTag之间,则节点内有一个节点,这就是我们定义DOM树层次结构的方式。2、生成CSSOM浏览器解析css文件,生成CSSOM。CSSOM包含了页面的所有样式,也就是如何显示DOM信息。CSSOM类似于DOM,但又有所不同。DOM构建是增量的,CSSOM不是。CSS是渲染阻塞:浏览器阻塞页面渲染,直到它接收并执行所有CSS。CSS是渲染阻塞的,因为规则可以被覆盖,所以在CSSOM完成之前无法渲染内容。3.RenderTreeRenderTree包括content和style:DOM树和CSSOM树组合成rendertree。为了构建渲染树,浏览器检查每个节点,从DOM树的根开始,并决定添加哪些CSS规则。渲染树仅包含可见内容(主体内部的部分)。Head(通常)不包含任何可见信息,因此不会包含在渲染树中。如果一个元素有display:none;在它上面,它本身和它的后代都不会出现在渲染树中。4.Layout一旦构建了rendertree,就可以进行layout了。布局取决于屏幕的大小。布局这一步决定了元素在页面上的位置和方式,决定了每个元素的宽度和高度,以及它们之间的相关性。提示:一个页面在不同尺寸的屏幕上渲染,比如在移动端和PC端渲染,显示效果是不一样的。前面的步骤不变,只是在布局上会根据屏幕大小有所区别。.5.Paint的最后一步是绘制屏幕上的像素点,将所有元素光栅化,将元素转化为实际的像素点。创建渲染树并完成布局后,即可在屏幕上绘制像素。加载时,绘制整个屏幕。之后只重绘受影响的屏幕区域,浏览器优化为只重绘需要绘制的最小区域。绘制时间取决于附加到渲染树的更新类型。绘图是一个非常快速的过程,因此这可能不是专注于提高性能的最有效部分。ReflowandRepaint理解了上面的关键路径渲染之后,理解reflow和repaint就是一个小case。回流:当元素的位置发生变化时发生重排,也称为回流。此时在布局阶段,计算每个元素在设备视口中的确切位置和大小。当一个元素的位置发生变化时,它的父元素和它后面的元素的位置都可能发生变化,这是非常昂贵的。在回答什么是重排时,关键不在于位置的变化,而在于原因(Why),而不是What。什么是重新计算设备视口中每个元素的确切位置和大小。重绘:元素的样式改变了,但是位置没有改变。此时,在关键渲染路径的Paint阶段,渲染树中的每个节点都被转换为屏幕上的实际像素,这一步骤通常称为绘图或光栅化。回答什么是重绘的关键是在关键渲染路径的Paint阶段,将渲染树中的每个节点都转化为屏幕上的实际像素。这是什么。JavaScript和关键路径渲染之前讲步骤的时候,基本上讲的是HTML、CSS和CRP之间的关系。最后说一下JS和CRP的关系,再看文章开头的那张图。JavaScript在生成渲染树之前执行。这就是为什么JavaScript的加载、解析和执行会阻塞DOM的构建,阻塞页面的渲染。这其实很合理。因为JavaScript可以修改网页的内容,它可以改变DOM。如果它没有阻塞,那么DOM正在此处构建,而JavaScript正在更改那里的DOM。如何保证最终的DOM是正确的?而在JS中前一秒获取到的DOM和后一秒获取到的DOM有什么区别呢?会造成一系列的问题,所以JS被阻塞了,就会阻塞DOM的构建过程,所以JS后面的元素在JS中是获取不到的,因为DOM还没有构建到那个。这就是为什么我们需要把js放到页面底部,并且尽量保证在加载JS之前生成DOM树,这样才会出现这个效果。性能优化基于上面的分析,简单说说几种性能优化的方法,大家可以分析一下为什么这些方法可以用于性能优化。减少DOM树渲染时间(例如减少HTML级别,使标签尽可能语义化等)。减少CSSOM树渲染时间(降低选择器级别等)。减少HTTP请求的数量和大小。将css放在页面的开头。js放在页面底部,使用defer或者async,尽量避免阻塞js加载,保证等到DOM树生成后才加载js。用链接替换@import。如果页面的css较少,尽量使用inline。为了减少白屏时间,在页面加载时快速生成DOM树。正确的性能优化思路下面说说性能优化。当你遇到性能问题的时候,你肯定不会去网上找一些性能优化的方法,然后不管问题怎么解决。大概率是没用的。首先要做的是分析性能瓶颈在哪里。首先要做的是分析性能瓶颈在哪里。首先要做的是分析性能瓶颈在哪里。比如首屏加载遇到性能问题,就需要借助开发者工具,比如看是不是资源太大导致网络请求慢,后端处理慢,或者由于资源太多加载缓慢。如果这些都不是,可能是渲染慢了,再分析一下性能面板,看看是不是js执行慢了,或者是什么原因。再比如你遇到webpack的性能问题,比如打包的资源太大,你要解决这个问题,不能随便找几个优化方法就开始调整。而是应该先用webpack-bundle-analyzer插件来分析包大的原因?是不是因为依赖包太大,没有按需加载?还是重复打包了同一个依赖的多个版本?还是因为src太大了,需要做动态加载?或者因为其他原因,使用webpack-bundle-analyzer分析的组合内容来查找问题。最后总结一下,遇到问题首先应该使用各种分析工具,找到造成性能瓶颈的原因,然后根据这个原因找到相应的优化方法,对症下药。不管是面试的时候回答,还是平时处理问题的时候,只要分析问题,解决的办法就很多。如果找不到问题,瞎折腾就是浪费时间。参考答案。相信经过复习,你对这个知识点应该很清楚了。面试的时候不需要说那么多。只说重点,让面试官知道你听懂了。如果面试官有兴趣,他会继续。对于提问者,此时我会详细介绍提问的要点。如果被问到这个问题,我的回答是这样的,仅供参考:重排和重绘是浏览器渲染关键路径上的两个节点,浏览器渲染关键路径是DOM和CSSOM生成渲染树,然后使用布局(也称为布局)步骤根据渲染树确定页面上所有内容的大小和位置。确定布局后,将像素绘制(也称为Paint)到屏幕上。其中,重排是指当元素的位置发生变化时,浏览器重新执行布局步骤,重新确定内容在页面中的大小和位置。重绘。如果元素位置没变,只是样式变了,浏览器重新渲染时,会跳过布局步骤,直接进入绘图步骤。这是重绘,所以重绘并不一定会导致重排。对于上面的回答,我想大部分面试官对于这道题都已经能打分了。但是,面试官可能会继续问更深入的问题。小伙伴们还有什么相关的问题可以在评论区告诉我们,后面我会继续帮大家一起分析。对于性能问题,减少重绘和回流感觉没那么重要,因为一般情况下优化不是很明显,不回答问题也没什么大不了的。更多的性能优化是对整个链路的优化,如性能优化标题。这8点。最后,在行业不景气的时候,希望大家能顺利找到合适的工作。
