HTML CSS JS 的加载
本文是HTML
CSS
JS
的加载流程相关知识的笔记。
浏览器组件
Chrome
每个标签页都分别对应一个呈现引擎实例,每个标签页都是一个独立的进程。
最重要的Rendering engine
有两种:Gecko
和 Webkit
。
渲染流程
基本渲染流程:
WebKit
渲染流程:
Gecko
渲染流程:
DOM :Document Object Model
文档对象模型,是 HTML
文本的对象表示,是 JS
语言的操作对象以及操作入口。
HTML
的解析状态机:
CSS
解析器:
正常网页加载流程
浏览器边下载HTML
网页,边解析。
解析到<head>
:
若是发现
css
外部脚脚本,则加载发现
<script>
标签,控制权转交给JS
引擎,JS
引擎一定是要等到前面的CSS
加载完全后,才运行的若是远程脚本,下载 + 执行 (同步阻塞)
若是
js
代码,直接执行 (同步阻塞)
PS:如果脚本加载时间很长,就会造成网页长时间失去响应,浏览器就会呈现“假死”或“阻塞效应”
PS: JS 采用阻塞加载的原因是:
js
有可能会修改dom
,如果不阻塞后续的资源下载,dom
的操作顺序不可控
html
在head
中所有的js
和css
加载完成后就开始绘制!
解析到body
:
这时
DOM
已经完成解析了,在界面渲染的同时,后续的js
并行地加载执行
优化:
<script defer="true" src='...'>
将会并行下载js
脚本,但是要到DOM
加载完成后才会按顺序执行。<script async="true" src='...'
表示异步并行下载JS
脚本,下载完成后立刻执行,不保证按照书写的顺序执行。所以需要保证js
不会修改dom
和样式,不依赖其它的js
和css
async 的实现是内部再启另一个线程去下载脚本,不会阻塞渲染