Contents

script标签

概述

script元素就是通过直接在页面嵌入 JS 代码或者通过加载外部脚本文件。

正常来说浏览器解析文档时遇到script会依次等代码下载、执行完以后才会继续解析,因此现在Web应用程序一般都会把引用的JS代码放在<body>元素的后面。了解决这个引入顺序问题,在script标签上提供了asyncdefer这两个属性。

属性

defer

延迟脚本,浏览器立即下载脚本,但是不会阻塞后面DOM的解析,脚本会延迟到DOM解析完后再去执行。

async

异步脚本,浏览器立即下载脚本,但是不会阻塞后面DOM的解析,哪个脚本先加载完就先执行,而且是加载完就立马执行。如果有DOM正在解析,会阻塞解析。

当script同时有async和defer属性时,执行效果和async一致。

推荐的应用场景

defer

如果你的脚本代码依赖于页面中的DOM元素(文档是否解析完毕),或者被其他脚本文件依赖。 例:

  1. 评论框
  2. 代码语法高亮
  3. polyfill.js

async

如果你的脚本并不关心页面中的DOM元素(文档是否解析完毕),并且也不会产生其他脚本需要的数据。 例:

  1. 百度统计

如果不太能确定的话,用defer总是会比async稳定。。。