浏览器资源加载顺序
资源加载顺序
在加载web资源时,首先下载html文件,进行html解析,在遇到javascript或css标签时,启动相应的解析机处理。
当遇到外部资源时(如<script src='xxx'>)启动网络接口程序,下载对应的资源并交由相应的解析机处理。
在执行javascript的解析的时候,为了保证javascript操作DOM的准确性,此时DOMTree的构建工作必须被中断掉(当然对于HTML资源序列化和输入DOM构建机动作可以同步进行,浏览器此时也可以加载外部资源、排版、显示等),直到javascript的解析动作完成,之后可以继续HTML的解析和DOMTree的构建。
我们知道CSS不会影响到DOMTree的构建,但是如果此时javascript需要取得某些样式信息,必然需要CSS已经被解析,为了防止javascript取CSS出现未定义的问题,通常在执行CSS解析的时候,javascript的执行会被阻塞。对于webkit而言,webkit本身对此进行了优化,即在javascript可能会用到某些样式而此时样式尚未解析完毕时阻塞javascript解析。
换一种方式理解:
DOM文档的加载顺序是由上而下的顺序加载;
1、DOM加载到link标签
css文件的加载是与DOM的加载并行的,也就是说,css在加载时Dom还在继续加载构建,而过程中遇到的css样式或者img,则会向服务器发送一个请求,待资源返回后,将其添加到dom中的相对应位置中;
2、DOM加载到script标签
由于js文件不会与DOM并行加载,因此需要等待js整个文件加载完之后才能继续DOM的加载,倘若js脚本文件过大,则可能导致浏览器页面显示滞后,出现“假死”状态,这种效应称之为“阻塞效应”;会导致出现非常不好的用户体验;
而这个特性也是为什么在js文件中开头需要$(document).ready(function(){})或者(function(){})或者window.onload,即是让DOM文档加载完成之后才执行js文件,这样才不会出现查找不到DOM节点等问题;
js阻塞其他资源的加载的原因是:浏览器为了防止js修改DOM树,需要重新构建DOM树的情况出现;
可以将scirpt标签放在body标签之后,这样就不会出现加载的冲突了。