<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>浏览器解析 HTML 文件 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E6%B5%8F%E8%A7%88%E5%99%A8%E8%A7%A3%E6%9E%90-html-%E6%96%87%E4%BB%B6/</link><description>Recent content in 浏览器解析 HTML 文件 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 06 Nov 2024 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E6%B5%8F%E8%A7%88%E5%99%A8%E8%A7%A3%E6%9E%90-html-%E6%96%87%E4%BB%B6/index.xml" rel="self" type="application/rss+xml"/><item><title>浏览器解析 HTML 文件</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-023/</link><pubDate>Tue, 05 Nov 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-023/</guid><description>&lt;h2 id="1-什么是浏览器解析和渲染html"&gt;1. 什么是浏览器解析和渲染HTML&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;一句话概括：将html代码转换成页面上显示的内容。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/html/html-023/image-01.webp"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;表1：形象展示将HTML转换成页面上显示的内容&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="2-浏览器解析和渲染html过程"&gt;2. 浏览器解析和渲染HTML过程？&lt;/h2&gt;
&lt;p&gt;那么浏览器拿到HTML代码后是如何把其转换成页面上显示的内容的？&lt;/p&gt;
&lt;h3 id="21-宏观描述执行过程"&gt;2.1 宏观描述执行过程&lt;/h3&gt;
&lt;h4 id="211-解析和渲染"&gt;2.1.1 解析和渲染&lt;/h4&gt;
&lt;p&gt;首先我们来看两个概念，解析和渲染，确切来说是DOM解析和DOM渲染。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DOM解析：&lt;/strong&gt; 生成DOM tree的过程。就是把你所写的各种html标签，生成一个DOM tree，可以认为就是生成了一个最原始的页面，一点样式都没有，毫无CSS修饰。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DOM渲染：&lt;/strong&gt; 将DOM tree与css样式结合，生成Render tree，并将其呈现在浏览器页面上。浏览器会把本身默认的样式+用户自己写得样式整合到一起，形成一个CSS tree，而DOM渲染就是指DOM tree 和CSS tree 结合到一起，生成一个Render tree，呈现出一个带有样式的页面。&lt;/p&gt;
&lt;p&gt;这里需要注意，&lt;strong&gt;DOM解析和DOM渲染由两个不同的线程来完成的，简单说就是二者可以并行进行。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DOM解析通常是由浏览器的主线程来完成的。DOM渲染是由浏览器的渲染线程来完成的。&lt;/p&gt;
&lt;p&gt;分离解析和渲染的这种设计使得浏览器能够在解析 HTML 文档的同时将页面渲染到屏幕上，这样用户就能够更快地看到完整的页面了。&lt;/p&gt;
&lt;h4 id="212-宏观描述执行过程"&gt;2.1.2 宏观描述执行过程&lt;/h4&gt;
&lt;p&gt;补充了解析和渲染的概念，我们来看看浏览器具体是如何把其转换成页面上显示的内容的。其过程大致分为下图的四步。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/html/html-023/image-02.webp"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;图1：浏览器解析和渲染HTML的过程&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步&lt;/strong&gt;：将载入的HTML文件解析成DOM树（DOM tree），并且将各个标记标识解析成DOM树的各个节点；在解析HTML的同时会将CSS样式解析成CSS规则（CSS rules）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二步&lt;/strong&gt;：将解析成的DOM树和CSS规则进行关联生成渲染树（Render tree）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三步&lt;/strong&gt;：进入布局阶段，为DOM树的每个节点分配在屏幕上出现的确切坐标（这一阶段还是渲染树）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第四步&lt;/strong&gt;：进入绘制阶段，在这里渲染引擎的工作就结束了，接下来就给用户界面后端（UI Backend）对渲染树的每个节点进行绘制，呈现出页面效果。&lt;/p&gt;
&lt;h3 id="22-细化执行过程"&gt;2.2 细化执行过程&lt;/h3&gt;
&lt;h4 id="221-顺序执行"&gt;2.2.1 顺序执行&lt;/h4&gt;
&lt;p&gt;dom解析过程是从上向下，顺序执行的。顺序执行的意思是一行一行的执行，上一行执行完再执行下一行。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;1&lt;span style="color:#f92672"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;2&lt;span style="color:#f92672"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;3&lt;span style="color:#f92672"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;script&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;style&amp;gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!-- 先1，再2，再3，按顺序解析。 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="222-渐进式"&gt;2.2.2 渐进式&lt;/h4&gt;
&lt;p&gt;浏览器是渐进式渲染，即边解析边渲染。通俗的说就是，这一行代码解析完，就可以在浏览器的页面渲染展示出来。因为浏览器的解析和渲染由两个不同线程来完成，所以可以实现边解析边渲染。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;1&lt;span style="color:#f92672"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;debugger&lt;span style="color:#f92672"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;2&lt;span style="color:#f92672"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;debugger&lt;span style="color:#f92672"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;3&lt;span style="color:#f92672"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!-- 先解析渲染出1，再debugger;再解析渲染出2，再debugger;最后解析渲染出3 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="23-问题cssjs会阻塞解析和渲染吗"&gt;2.3 问题：css、js会阻塞解析和渲染吗？&lt;/h3&gt;
&lt;p&gt;这部分内容可参考这篇掘金内容，内含测试代码：&lt;a href="https://juejin.cn/post/6973949865130885157#heading-0"&gt;关于 JS 与 CSS 是否阻塞 DOM 的渲染和解析 - 掘金&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>