# 深入理解浏览器运行原理
## 网页解析过程
输入域名 => DNS解析为IP => 目标服务器返回`index.html`
> DNS:Domain Name System
## HTML解析过程
- 浏览器开始解析`index.html`文件,当遇到``则向服务器请求下载`.css`文件
- 遇到`
```
```
// defer.js
console.log('defer script enter')
```
上述代码在控制台的输出为:
```
script enter
defer script enter
DOMContentLoaded enter
```
- 多个带`defer`的脚本也是按照自上至下的顺序执行的
- 从某种角度来说,`defer`可以提高页面的性能,并且推荐放到`head`元素中
- 注意:`defer`仅适用于外部脚本,对于`script`标签内编写的默认`JS`代码会被忽略掉
## async属性
`async`属性也可以做到:让脚本异步加载而不阻塞DOM树的构建,它与`defer`的区别:
- 用`async`标记的脚本是**完全独立**的
- `async`脚本不能保证执行顺序,因为它是独立下载、独立运行,不会等待其他脚本
- 使用`async`标记的脚本不会保证它将在`DOMContentLoaded`之前或之后被执行
要使用`async`属性标记的`script`操作DOM,必须在其中使用`DOMContentLoaded`监听器的回调函数,在该事件触发(DOM树构建完毕)后,执行相应的回调函数