script标签中async和defer的异同

102 阅读1分钟

GPU渲染进程和js引擎线程是互斥的,当js引擎执行时GPU线程会被挂起,GPU更新会被保存在一个队列中等待js引擎空闲时立即被执行,如果js执行的时间过长,会导致页面渲染被阻塞。

相同点

  1. 只用于外联script
  2. script下载和html解析并行

不同点

区别asyncdefer
脚本执行时机①下载脚本时执行脚本,可能在html解析完之前执行,如果脚本中操作了DOM可能会出错image.png②多个async的脚本会并行下载,先执行已下载的部分①等待html解析完执行脚本image.png②多个defer的脚本并行下载,但是执行顺序和在document中出现的顺序一致(有点像Promise.all()的返回顺序)
适用场景脚本中不需要操作DOM,并且与其他脚本互不依赖需要操作DOM的脚本,如jQuery。将脚本放到body底部和defer都是在html解析完加载,区别是defer会在html解析的过程中下载脚本
优先级同时使用async、defer,async的优先级更高