浏览器解析html

130 阅读1分钟

浏览器拿到html文档开始解析,先是解析dom,期间会遇到 <script><link>, 看看这俩标签对 dom 的解析 和 渲染会产生什么影响吧?

<script> 阻塞DOM解析和渲染

<script> 的网络加载、解析、运行 都会阻塞DOM的解析和渲染,直到脚本执行完毕后才会继续解析dom

<script>
    console.log(document.querySelector('div')); 
</script>
<div /> // 获取不到div

<script> 标签会触发页面Paint

浏览器将 <script> 标签之前的元素渲染出来

  • <head> 中的 <script> 标签是不会触发Paint的
  • 内联的 <script> 也不会触发Paint
<div>a</div>
<script src='test.js'></script>  // 大循环延长js执行时间
<div>b</div>
// 先展示 a div,  然后展示b div

// 如果把script换成内联的,那么结果就是等js运行完毕之后,两个div才会一起显示

<link> 标签不会阻塞DOM解析但会阻塞DOM渲染

<script>
    document.addEventListener('DOMContentLoaded', () => {
        console.log(document.querySelectorAll('div'))
    })
</script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.css">
<div></div>
// div 会被打印,但是过会儿才渲染出来

<link> 标签会阻塞js的执行(因为js可能会去获取样式信息)

<script>
    document.addEventListener('DOMContentLoaded', () => {
        console.log(document.querySelectorAll('p'))
    })
</script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.css">
<script>
    console.log(Date.now());
</script>
<p>1234</p>
// link阻塞了下方script的执行,所以自然也卡住了dom的解析
// 倘若注释掉上方的script你会发现p会被打印,然后再渲染出来