网页加载的奇幻之旅:从零开始
发表时间: 2024-02-22 17:19
1. HTML解析
- 当浏览器开始加载HTML文档时,它会从上到下解析HTML文件。在解析过程中,浏览器会构建DOM(文档对象模型)树。
2. 遇到外部链接(CSS、JavaScript)
- 当解析器遇到外部CSS链接(<link>标签)时,它通常会停止DOM构建,等待CSS文件下载并解析完成,因为CSS可能影响后续DOM元素的渲染。
- 当解析器遇到传统的JavaScript脚本(<script>标签)时,它也会停止DOM构建,等待脚本下载和执行完成,因为脚本可能会修改DOM。
3. defer async
- defer属性:用于<script>标签,指示浏览器应该在继续构建DOM的同时异步下载脚本,但延迟执行直到整个文档解析完成。所有带defer的脚本将在DOMContentLoaded事件之前按顺序执行。
- async属性:也用于<script>标签,指示浏览器异步下载脚本,并在脚本下载完成后立即执行,而不用等待HTML文档解析完成。async脚本的执行顺序不能保证。
4. DOMContentLoaded事件
- 当HTML文档被完全加载和解析时,不包括样式表、图片和iframe的加载,DOMContentLoaded事件将被触发。
- 如果脚本有defer属性,它们将在DOMContentLoaded事件之前按顺序执行。
5. 其他资源的加载
- 在DOMContentLoaded事件之后,浏览器会继续加载页面上的其他资源(如图片、样式表、iframe等)。
6. onload事件
- 当文档及其所有依赖资源(如样式表和图片)完全加载后,window对象的onload事件将被触发。
- 这标志着整个页面的加载过程结束。
7. JavaScript执行
- 在整个文档解析过程中,JavaScript(无论是内联的还是通过<script>标签引入的)可以被执行,具体取决于它的位置和是否使用了defer或async属性。
- 使用defer的脚本会在文档解析结束后按顺序执行,而async脚本则会在它们加载完成后尽快执行。
注意
- 使用async和defer可以提高页面加载性能,因为它们允许HTML解析和脚本下载并行进行。
- JavaScript脚本的放置位置(在<head>或<body>)也会影响加载和执行的时机。通常推荐将脚本放在<body>标签的底部,以提高页面加载性能。