突然看到script中出现 async defer属性,不太理解,阅读了大量网上解析后,不知道怎么回事,之前感觉理解清楚了,现在我突然糊涂了(可能是没有休息好,此处是借口),不知道什么情况下使用async 和 defer 是最优的,请大神们给我一个通俗的解释.越俗越好.
以下是我理解的过程
阅读文档后我大概得到了以下的理解
async:仅适用于外链,下载时不会阻塞页面链接,脚本加载后立即执行,执行时阻塞html解析,不会按顺序执行那个完成就执行哪一个.执行的时候有可能页面没有加载完成.
defer:仅适用于外链,规定脚本延迟执行,不会阻塞页面解析,在 HTML 解析完成后,DOMContentLoaded 之前执行,按照出现的顺序执行.
得到以上理解之后看了一篇文章https://segmentfault.com/a/1190000006778717
这篇文章最后的结论是
其实这么讲来,最稳妥的办法还是把<script>
写在<body>
底部,没有兼容性问题,没有白屏问题,没有执行顺序问题,高枕无忧,不要搞什么defer
和async
的花啦~
在这片文章的评论中:
给出了使用async和defer的好处:节省时间
将js放在头部,用defer或async异步加载。相比js放到底部什么都不加。不是省了下载文件的时间嘛
那问题来了,在优化的情况下,
问题一:我想使用async和defer,什么时候使用async defer不会出现兼容,白屏等问题,
问题二:或者说在出现兼容,白屏等问题,在优化的情况下有没有解决方案
defer
、async
async
,因为它是独立的,加载完就执行defer
,因为会按照它们在页面中的顺序执行defer
的 JS 在执行完毕前会阻止浏览器触发DOMContentLoaded
事件,所以在比较老的页面里(通常依赖 jQuery 的$(function () {})
)要慎用