资讯专栏INFORMATION COLUMN

浅谈script标签的defer和async

Developer / 1201人阅读

摘要:也就是说是乱序的,而是顺序执行,这也就决定了比较适用于百度分析或者谷歌分析这类不依赖其他脚本的库。然而,这张图几乎是百度搜到的唯一答案是不严谨的,这只是规范的情况,大多数浏览器在实现的时候会作出优化。

1. 什么鬼

今天在做一个小需的时候,忽然看到前辈一句吊炸天的代码

    

卧槽,竟然同时有asyncdefer属性,心想着肯定是前辈老司机的什么黑科技,两个一块儿肯定会发生什么神奇化学反应,于是赶紧怀着一颗崇敬的心去翻书翻文档,先复习一下各自的定义。

2. 调查一番

先看看asyncdefer各自的定义吧,翻开红宝书望远镜,是这么介绍的

2.1 defer

这个属性的用途是表明脚本在执行时不会影响页面的构造。也就是说,脚本会被延迟到整个页面都解析完毕后再运行。因此,在蓝色线代表网络读取,红色线代表执行时间,这俩都是针对脚本的;绿色线代表 HTML 解析。

也就是说async是乱序的,而defer是顺序执行,这也就决定了async比较适用于百度分析或者谷歌分析这类不依赖其他脚本的库。从图中可以看到一个普通的 ul>li{这是第$个节点}*1000

一个简单的demo,从各个CDN上引用了2个CSS3个JS,在body里面创建了1000个li。通过调整外部引用资源的位置和加入相关的属性利用chrome的Timeline进行验证。

3.2 放置在


异步加载资源,但会阻塞的渲染会出现白屏,按照顺序立即执行脚本

3.3 放置在底部


异步加载资源,等中的内容渲染完毕后且加载完按顺序执行JS

3.3 放置在头部并使用async


异步加载资源,且加载完JS资源立即执行,并不会按顺序,谁快谁先上

3.4 放置在头部并使用defer


异步加载资源,在DOM渲染后之后再按顺序执行JS

3.5 放置在头部并同时使用asyncdefer


表现和async一致,开了个脑洞,把这两个属性交换一下位置,看会不会有覆盖效果,结果发现是一致的 = =、

综上,在webkit引擎下,建议的方式仍然是把

阅读需要支付1元查看
<