script标签async和defer的作用

一般来说为了防止页面白屏,script标签会放到body标签的最后面也就是</body>之前。如果把script标签放在head标签里而且没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该script标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行,这样就会阻塞后续的文档解析。

<script src="test.js" defer>
<script src="test.js" async>

defer和async可以用来控制外部脚本的执行。首先可以看看解释。
defer:用于开启新的线程下载脚本文件,并使脚本在文档解析完成后执行。
async:HTML5新增属性,用于异步下载脚本文件,下载完毕立即解释执行代码。
那defer与async有什么本质区别呢?
defer加载后续文档元素的过程将和 script.js 的加载并行进行(异步),但 script.js 的执行要在所有元素解析完成之后,DOMContentLoaded 事件触发之前完成,所以如果是脚本并没有外部引用不要使用defer。
async加载和渲染后续文档元素的过程将和 script.js 的加载与执行并行进行(异步),其他线程将下载脚本,文档的解析不会停止,脚本下载完成后开始执行脚本,脚本执行的过程中文档将停止解析,直到脚本执行完毕。

所以async和defer的最主要的区别就是async是异步下载,下载完后立即执行,不影响文档的解析,defer是异步加载后解析文档。

如果有多个defer脚本,会按照顺序下载解析。而多个async脚本下载与解析的顺序是不一定的,所以如果脚本之间有依赖关系不要用async。

参考详解defer和async的原理及应用,实例可以查看这篇文章。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该 script 标签之下...
    饥人谷_Shirley阅读 4,479评论 0 0
  • 浏览器中script标签加载顺序是如何的呢?这个问题折腾了好几次了,之前弄清楚了以后,觉得做不做笔记的无关紧要,可...
    世事如烟_f411阅读 5,473评论 0 1
  • defer和async是script标签的两个属性,用于在不阻塞页面文档解析的前提下,控制脚本的下载和执行。我们先...
    曾祥辉阅读 10,483评论 0 2
  • 本文总结一下浏览器在 javascript 的加载方式。关键词:异步加载(async loading),延迟加载(...
    4ea0af17fd67阅读 4,676评论 0 2
  • 那天,她走进一家朋友新推荐的书店。因为觉得那里的书挺好看,买了几次之后都觉得很满意! 她进店的时候正是中午时分,店...
    风衣雨剑阅读 2,187评论 0 1