脚本和样式表的处理顺序
脚本:当解析器遇到<script>标签时,解析器就挂起,直到脚本执行完成才继续解析,当脚本是外部的,就是引用的那种时,必须首先从网络中获得该脚本文件,这也是以同步的方式完成的,就是说,解析器也会挂起,直到文件获取完毕,这样的模型已经使用了很多年,在html4和html5中都是这样规定的。开发者可以将脚本标记成“defer”,这样,解析器就不会在遇到脚本时挂起等待,html5则更进一步,通过新增了一个选项,使脚本标记为异步的,这样,解析和执行就放在不同的线程里了。
智能解析:Webkit和firefox都有这样的优化,那就是在执行脚本的时候,另一个线程解析余下的文档,并找出其他需要从网络中加在的资源文档,然后加载它们。在这种方式下,资源文件会通过并行的连接加载,因而整体速度要好的多。当然,智能解析并不会改变DOM树,那是主解析器做的事情,它只会解析外部引用的资源,例如脚本,样式表和图片。
样式表:样式表的解析则采用了另一种模型。原理上讲,样式表并不会改变DOM树,因此没有理由停下文档解析来等它。但是有个问题,如果脚本中有用到样式信息,而样式又没有加载并解析,这就会产生很多问题。Firefox的做法是,当一个样式表还在加载和解析过程中时,挂起所有脚本的执行。Webkit则稍微柔和些,只有在脚本需要访问那些没被加载的样式时才挂起等待。(所以,脚本里面尽量不要用到样式哦!)
脚本:当解析器遇到<script>标签时,解析器就挂起,直到脚本执行完成才继续解析,当脚本是外部的,就是引用的那种时,必须首先从网络中获得该脚本文件,这也是以同步的方式完成的,就是说,解析器也会挂起,直到文件获取完毕,这样的模型已经使用了很多年,在html4和html5中都是这样规定的。开发者可以将脚本标记成“defer”,这样,解析器就不会在遇到脚本时挂起等待,html5则更进一步,通过新增了一个选项,使脚本标记为异步的,这样,解析和执行就放在不同的线程里了。
智能解析:Webkit和firefox都有这样的优化,那就是在执行脚本的时候,另一个线程解析余下的文档,并找出其他需要从网络中加在的资源文档,然后加载它们。在这种方式下,资源文件会通过并行的连接加载,因而整体速度要好的多。当然,智能解析并不会改变DOM树,那是主解析器做的事情,它只会解析外部引用的资源,例如脚本,样式表和图片。
样式表:样式表的解析则采用了另一种模型。原理上讲,样式表并不会改变DOM树,因此没有理由停下文档解析来等它。但是有个问题,如果脚本中有用到样式信息,而样式又没有加载并解析,这就会产生很多问题。Firefox的做法是,当一个样式表还在加载和解析过程中时,挂起所有脚本的执行。Webkit则稍微柔和些,只有在脚本需要访问那些没被加载的样式时才挂起等待。(所以,脚本里面尽量不要用到样式哦!)