接上次的文章,
当用户在地址栏输入链接,并按下enter后
dns解析=》tcp链接=》发起get/post请求
获取到站点返回的html=》开始逐步解析并渲染页面
那么解析到head标签中的script标签是啥样子具体的顺序呢,又如何控制的顺序呢
这里涉及到script的两个属性值,async,defer
边看代码先分析
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Script Loading Demo</title>
<!-- CSS 下载并行,不阻塞解析 -->
<link rel="stylesheet" href="style.css">
<!-- 普通 script:阻塞解析 -->
<script src="normal.js"></script>
<!-- defer:异步下载,DOM 完成后按顺序执行 -->
<script defer src="defer1.js"></script>
<script defer src="defer2.js"></script>
<!-- async:异步下载,下载完成立即执行 -->
<script async src="async1.js"></script>
<script async src="async2.js"></script>
</head>
<body>
<h1>Page Start</h1>
<p>Check the console to see execution order.</p>
<!-- 图片异步加载 -->
<img src="image1.png" alt="Image 1">
<img src="image2.png" alt="Image 2">
<div id="app">Hello World</div>
</body>
</html>
normal 下载完成后直接执行,阻塞后面dom的解析和渲染
defer1和defer2 下载时不会阻塞dom的解析和渲染,并且下载完成后会等dom渲染完成后才会按照从上到下的顺序依次执行
async1和async2 下载时同时也不会阻塞dom的解析和渲染,但是他下载完成后会立刻执行,执行的时候会阻塞dom的解析和渲染,同时开始,完成插队
defer:解析 + 下载 + 渲染并行,执行必须等待 DOM 构建完成后才开始,按脚本顺序执行。
async:解析和下载+渲染同时进行,等下载完成后立马执行,但是执行的时候会阻塞正在解析的渲染
普通的:下载和执行都阻塞 DOM 解析,遇到就停,下载 + 执行 = DOM 堵车
<script>
(非 async/defer)<script>
→ 浏览器暂停 DOM 解析HTTP/1.1 限制
HTTP/2 优化
资源优先级策略