Javascript CSSOM和DOM构造是否发生在并行线程上?

Javascript CSSOM和DOM构造是否发生在并行线程上?,javascript,google-chrome,browser,Javascript,Google Chrome,Browser,我一直在网上寻找这个答案。但这个问题没有具体的答案。我想知道每个进程在渲染中是如何工作的(即使用多线程或单线程)为了渲染页面,浏览器必须执行以下步骤:解析/加载、样式计算、创建布局树、绘制,最后(在这一步中,浏览器将获取从前面所有步骤生成的结果,并将该信息转换为在屏幕上绘制的彩色像素) 简而言之,在解析/加载步骤中,主线程开始解析html,并创建dom树,当它到达外部资源时,甚至达到峰值时,它开始在后台网络线程中加载这些资源。除非您延迟加载这些资源,否则浏览器仍需要在进入下一步之前解析/执行它们

我一直在网上寻找这个答案。但这个问题没有具体的答案。我想知道每个进程在渲染中是如何工作的(即使用多线程或单线程)

为了渲染页面,浏览器必须执行以下步骤:解析/加载、样式计算、创建布局树、绘制,最后(在这一步中,浏览器将获取从前面所有步骤生成的结果,并将该信息转换为在屏幕上绘制的彩色像素)

简而言之,在解析/加载步骤中,主线程开始解析html,并创建dom树,当它到达外部资源时,甚至达到峰值时,它开始在后台网络线程中加载这些资源。除非您延迟加载这些资源,否则浏览器仍需要在进入下一步之前解析/执行它们

在样式计算步骤中,浏览器确定每个节点的样式,这也发生在主线程中,并且需要在创建dom之后发生。样式不能与dom解析并行计算,因为样式需要基于css选择器进行计算,如果没有dom树,css选择器是没有意义的结构完整,易于阅读

计算完样式后,浏览器开始创建布局树-您可以将布局树视为由较小矩形创建的巨大矩形网格,浏览器知道每个元素的位置以及整个网格中的小矩形,以及x、y坐标和边框大小。这一步也发生在t主线程,并且不能与样式计算并行,因为它需要dom和cssom作为输入以生成其输出

绘制完成后,也会发生在主线程中,并且再次需要以前的结果作为其输入,因此无法与布局创建并行,在此步骤中,浏览器将为整个布局树创建绘制结构

从这里,浏览器将所有这些信息提交到,这是并行工作开始的地方,合成器线程知道如何获取布局树,并将其合成到您看到的帧中。合成器线程非常智能,它知道如何对工作负载进行优先级排序和并行化,它将其工作负载发送到不同的rasterisation线程,这些线程负责为您提供屏幕中绘制的彩色像素


合成器线程不仅用于初始渲染,还可在主线程想要渲染内容的任何时候使用。事实上,当您滚动时,您正在合成器线程上滚动,最近chromium已将大量内容移动到合成器线程,因此即使主线程被阻止,ui仍会运行顺利。如果你想了解更多关于合成器线程的信息,你也可以看到(连同我的一个)

我想没有具体的答案,在新版本中它可能会在任何时候发生变化,这是因为它对任何其他组件都不重要。你为什么在意?你能分享你已经找到的非具体答案吗?@Bergi我同意不会有具体的例子,特别是这是一个实现细节但是,在实践中,如果dom没有完全构建和准备好,就无法创建CSSOM,因为样式计算需要css选择器,如果没有准备好的dom,css选择器完全没有意义。但是谁知道,将来可能会发生变化,web可能会引入新的html/css语法来支持c某些css样式将与dom解析并行应用。对不起,我指的是具体的answer@ehab解析CSS、创建CSSOM对象和进行样式计算是不同的事情,可能会也可能不会与构建DOM并行发生。感谢您的详细回答。因此,根据我在多篇文章中阅读的内容和我的理解我认为这是:浏览器得到第一个字节,它开始解析和构建DOM,当它遇到CSS资源时,它获取相同的字节,并保持并行构建CSSOM,然后在某个点上它合并CSSOM和DOM以呈现树。不,不是这样的,浏览器中的所有事情几乎都发生在主线程中-除了javascript主线程开始解析html,当它到达一个像内联css这样的资源时,它会对它进行解析,它会创建一个内部结构,使其易于处理这个css。稍后,可能会在此时创建一个cssom内部表示,但只有dom准备好后再执行sed。样式计算仅在dom完全准备好后进行,也会在主线程中进行。@Devinder样式计算必须在dom准备好后进行,因为这在其他方面没有意义,显然可以在dom的快照上开始进行,但在初始渲染时没有意义,因为dom将更改,所有这些样式计算都将被丢弃,需要重新计算。这就是为什么在初始渲染时,样式计算会在dom完全就绪后进行