<script defer="defer" src="a.js"></script>
上述代码中的defer标签即为延迟脚本的标志,
效果:加了这个标签后即使脚本在HTML的<head>元素中,这个脚本也会在浏览器遇到</html>标签后才运行
作用:这样做脚本就不会影响页面的构造,从而让页面快速解析,因为如果没有这个标签的话,浏览器加载页面是从上到下的,即当它读取到脚本的时候他会先去下载并且加载,这样就影响了页面的速度,而defer标签则让其延迟加载.浏览器开始解析HTML网页 解析过程中,发现带有defer属性的script标签 浏览器继续往下解析HTML网页,同时并行下载script标签中的外部脚本 浏览器完成解析HTML网页,此时再执行下载的脚本。
注意事项:如果有两个或者以上的延迟脚本,理论上他们会按照顺序来执行,但实际上有时候并不会,所以最好只包含一个延迟脚本.
<script async src="a.js"></script>
效果:加了这个标签后即使脚本在下载完之后才加载,而且下载和解析网页时同时进行的。
作用:浏览器开始解析HTML网页,解析过程中,发现带有async属性的script标签 浏览器继续往下解析HTML网页,同时并行下载script标签中的外部脚本 ,脚本下载完成,浏览器暂停解析HTML网页,开始执行下载的脚本, 脚本执行完毕,浏览器继续解析HTML网页。
注意事项:尽量不要在异步脚本的加载期间修改dom。
总结:defer属性是先下载完脚本然后执行完HTML再加载脚本,而async属性是哪个下载完了就立刻加载,后面的脚本有可能下载的比前面的快,这也是为什么async不能保证加载顺序的原因,当两个标签同时存在时,async不起作用,两个属性都只对外部脚本有用,这两个标签都有效的防止阻塞效应的出现,提高网页的加载速度。