html,css,js加载顺序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

html,css,js加载顺序
1.js放在head中会⽴即执⾏,阻塞后续的资源下载与执⾏。

因为js有可能会修改dom,如果不阻塞后续的资源下载,dom的操作顺序不可控。

正常的⽹页加载流程是这样的。

1. 浏览器⼀边下载HTML⽹页,⼀边开始解析
2. 解析过程中,发现<script>标签
3. 暂停解析,⽹页渲染的控制权转交给JavaScript引擎
4. 如果<script>标签引⽤了外部脚本,就下载该脚本,否则就直接执⾏
5. 执⾏完毕,控制权交还渲染引擎,恢复往下解析HTML⽹页
如果外部脚本加载时间很长(⽐如⼀直⽆法完成下载),就会造成⽹页长时间失去响应,浏览器就会呈现“假死”状态,这被称为“阻塞效应”。

html需要等head中所有的js和css加载完成后才会开始绘制,但是html不需要等待放在body最后的js下载执⾏就会开始绘制,因此将js放在body的最后⾯,可以避免资源阻塞,同时使静态的html页⾯迅速显⽰。

将脚本⽂件都放在⽹页尾部加载,还有⼀个好处。

在DOM结构⽣成之前就调⽤DOM,JavaScript会报错,如果脚本都在⽹页尾部加载,就不存在这个问题,因为这时DOM肯定已经⽣成了。

2.js的执⾏依赖前⾯的样式。

即只有前⾯的样式全部下载完成后才会执⾏js,但是此时外链css和外链js是并⾏下载的。

css需要分块,⾸页的css独⽴,其余的css需要动态加载,因为html的绘制会被css阻塞,这样可以减少⾸次进⼊时的⽩屏时间。

3.外链的js如果含有defer="true"属性,将会并⾏加载js,到页⾯全部加载完成后才会执⾏,会按顺序执⾏。

defer属性的作⽤是,告诉浏览器,等到DOM加载完成后,再执⾏指定脚本。

1. 浏览器开始解析HTML⽹页
2. 解析过程中,发现带有defer属性的script标签
3. 浏览器继续往下解析HTML⽹页,同时并⾏下载script标签中的外部脚本
4. 浏览器完成解析HTML⽹页,此时再执⾏下载的脚本
对于内置⽽不是连接外部脚本的script标签,以及动态⽣成的script标签,defer属性不起作⽤。

4.外链的js如果含有async="true"属性,将不会依赖于任何js和css的执⾏,此js下载完成后⽴刻执⾏,不保证按照书写的顺序执⾏。

因为async="true"属性会告诉浏览器,js不会修改dom和样式,故不必依赖其它的js和css。

 
async属性的作⽤是,使⽤另⼀个进程下载脚本,下载时不会阻塞渲染。

1. 浏览器开始解析HTML⽹页
2. 解析过程中,发现带有async属性的script标签
3. 浏览器继续往下解析HTML⽹页,同时并⾏下载script标签中的外部脚本
4. 脚本下载完成,浏览器暂停解析HTML⽹页,开始执⾏下载的脚本
5. 脚本执⾏完毕,浏览器恢复解析HTML⽹页
async属性可以保证脚本下载的同时,浏览器继续渲染。

需要注意的是,⼀旦采⽤这个属性,就⽆法保证脚本的执⾏顺序。

哪个脚本先下载结束,就先执⾏那个脚本。

另外,使⽤async属性的脚本⽂件中,不应该使⽤document.write⽅法。

⼀般来说,如果脚本之间没有依赖关系,就使⽤async属性,如果脚本之间有依赖关系,就使⽤defer属性。

如果同时使⽤async和defer属性,后者不起作⽤,浏览器⾏为由async属性决定。

相关文档
最新文档