<script> 的 defer 和 async

最近重新翻了翻JavaScript高级程序设计,还是有很多小收获的。

script标签定义了6个属性

  • async 表示立即下载脚本,但不影响页面中的其他操作
  • charset 表示通过src属性指定的代码的字符集
  • defer 表示脚本可以延迟到文档完全被解析和显示后再执行
  • language 已废弃,原来是用于表示编写代码所使用的脚本语言
  • src 表示包含要执行代码的外部文件
  • type 可以看成是language的替代属性

今天来聊聊defer 和 async这两个属性。

正常情况下的使用

<html>
    <head>
    </head>
    <body>
        ...
        <script src="xxx.js"></script>
        ...
    </body>
</html> 
normal

浏览器会按照<script>元素在页面中出现的顺序加载。也就是说第一个解析完成,才会对第二个进行接续,然后才是第二个,第三个......

defer

<html>
    <head>
            <script defer src="xx1.js"></script>
            <script defer src="xx2.js"\></script>
    </head>
    <body>
        ...
    </body>
</html> 
defer
defer

就算我们把<script>标签放在<head>中,这两个js文件也是会在遇到</html>时才会执行。虽然html5规范要求脚本按照他们出现的顺序执行,并先于DOMContentLoaded事件。但在现实中,延迟脚本不一定按照顺序执行,且不一定先于DOMContentLoaded事件。所以最好只含有一个延迟脚本,且放在底部。

async

<html>
    <head>
            <script async src="xx1.js"></script>
            <script async src="xx2.js"></script>
    </head>
    <body>
        ...
    </body>
</html> 
async

如上面的例子,第二个脚本可能会在第一个脚本前执行,且不让页面等待他们加载和执行,从而加载页面的其他内容。

script标签的使用

按照传统的方法,<script>元素应该放在页面的<head>元素中,但是<head>元素中如果包含了所有的js文件,意味着要等待所以的js文件加载完成和执行完成之后,才能呈现页面的内容,导致会有一段白屏时间。所以为了规避这个问题,一般把全部的javascript放在</body>前。

如果一个脚本不依赖于其他脚本,这时候使用async属性还是很有用的。

兼容性

defer
defer

async
async

浏览器对defer和async的支持还是相当广的。在XHTML文档中,要把async属性设置成async="async",defer也一样。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • defer 延迟脚本: 例子: 1.脚本会延迟到整个页面都解析完毕后,DOMContentLoaded 事件触发之...
    Llane00阅读 810评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,853评论 18 139
  • 简单介绍JavaScript的发展历史 JavaScript因互联网而生,回顾它的历史要从浏览器的历史讲起。 19...
    _Dot912阅读 504评论 0 3
  • 一:在制作一个Web应用或Web站点的过程中,你是如何考虑他的UI、安全性、高性能、SEO、可维护性以及技术因素的...
    Arno_z阅读 1,205评论 0 1
  • hi,你来啦 这里是 鲸鱼 的 茶空间 Part1 把一杯茶泡过100...
    鲸鱼先生T阅读 501评论 0 1