HTML5 script元素async、defer异步加载使用介绍


Posted in HTML / CSS onAugust 23, 2013

(译者注: 异步加载,可以理解为无阻塞并发处理.)

我对于HTML5感到兴奋不已的原因之一是它实现了众多业界期待已久的特性。我们一直需要输入框显示空白提示,但都是用JavaScript来实现的。我们也想要整个块都变成可被点击,也是使用JavaScript来实现。
现在WebKit为HTML5实现了SCRIPT标签的async异步属性。过去我们使用各种JavaScript技巧来做这种事情,但现在新的属性让防止阻塞变得相对容易。

async - HTML属性
如我前面提到的,添加async属性非常简单:

复制代码
代码如下:

<!-- 指定async,以及 onload 回调-->
<script async src="siteScript.js" onload="myInit()"></script>

事实上,如果你的JavaScript以及HTML结构设计的合理,那么90%的情况下你的Script元素可以使用异步加载。

defer - HTML属性
Safari 浏览器额外添加了defer属性

复制代码
代码如下:

<!-- 指定defer,效果和async差不多-->
<script defer src="siteScript.js" onload="myInit()"></script>

async 与 defer 的差别
WebKit官方博客 很好地解释了async 与 defer 的不同
------------------------------------
正常情况下,当浏览器在解析HTML源文件时如果遇到外部的script,那么解析过程会暂停,并发送请求来下载script文件,只有script完全下载并执行后才会继续执行DOM解析。比如:
<script src="myBlockingScript.js"></script>
在下载过程中浏览器是被阻止做其他有用的工作的,包括 解析HTML,执行其他脚本,以及展示CSS布局。虽然Webkit预加载扫描程序可以探测性地在下载阶段进行多线程下载,但是某些页面仍然存在很大的网络延迟。
当前有很多技术来提升页面显示速度,但都需要额外的代码以及针对特定浏览器的技巧。现在,script可以通过添加async或者defer属性来让脚本不必同步执行,示例如下:
复制代码
代码如下:

<script async src="myAsyncScript.js" onload="myInit()"></script>
<script defer src="myDeferScript.js" onload="myInit()"></script>

async 和 defer 标注的 script 都不会暂停HTML解析就立刻被下载,两者都支持onload事件回调来解决需要该脚本来执行的初始化。
两者的区别在于执行时的不同:
async 脚本在script文件下载完成后会立即执行,并且其执行时间一定在 window的load事件触发之前。这意味着多个async脚本很可能不会按其在页面中的出现次序顺序执行。
与此相对,浏览器确保多个 defer 脚本按其在HTML页面中的出现顺序依次执行,且执行时机为DOM解析完成后,document的DOMContentLoaded 事件触发之前。

下面展示的是一个需要1秒来下载,以及1秒来解析执行其他操作的例子,我们可以看到整个页面载入花了大约2秒钟。
HTML5 script元素async、defer异步加载使用介绍 
同样的例子,但这次我们指定了script的 defer 属性.因为当defer脚本下载的时候,其他操作可以并行执行,所以大概快了1倍。
HTML5 script元素async、defer异步加载使用介绍 
------------------------------------
哪些浏览器支持async 和 defer
同样是上面引用的文章中提到:

除了基于Webkit的新版本浏览器,FireFox已经支持defer和onload属性很长时间了,而且从FF3.6开始添加了async属性。IE同样支持defer属性,但还不支持async属性,从IE9开始,onload属性也将被支持。

aynsc 棒极了!
看到webkit实现async我开心得合不拢嘴了。对每个网站来说,阻塞都是一个巨大的性能瓶颈,而可以直接指定script文件异步加载无疑会加快web页面的速度.

HTML / CSS 相关文章推荐
前端面试必备之CSS3的新特性
Sep 05 HTML / CSS
CSS3中的5个有趣的新技术
Apr 02 HTML / CSS
定义css设备类型-Media Queries图表简介及使用方法
Jan 21 HTML / CSS
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
Jan 23 HTML / CSS
CSS3 透明色 RGBA使用介绍
Aug 06 HTML / CSS
css3的transform造成z-index无效解决方案
Dec 04 HTML / CSS
简单几步用纯CSS3实现3D翻转效果
Jan 17 HTML / CSS
CSS3实现线性渐变用法示例代码详解
Aug 07 HTML / CSS
Html5新特性用canvas标签画多条直线附效果截图
Jun 30 HTML / CSS
推荐WEB开发者最佳HTML5和CSS3代码生成器
Nov 24 HTML / CSS
html5需遵循的6个设计原则
Apr 27 HTML / CSS
html解决浏览器记住密码输入框的问题
May 07 HTML / CSS
html5基础教程常用技巧整理
Aug 20 #HTML / CSS
HTML5中div、article、section的区别及使用介绍
Aug 14 #HTML / CSS
用html5的canvas画布绘制贝塞尔曲线完整代码
Aug 14 #HTML / CSS
HTML5 embed 标签使用方法介绍
Aug 13 #HTML / CSS
HTML5 input元素类型:email及url介绍
Aug 13 #HTML / CSS
HTML5 预加载让页面得以快速呈现
Aug 13 #HTML / CSS
HTML5的语法变化介绍
Aug 13 #HTML / CSS
You might like
thinkphp3.0输出重复两次的解决方法
2014/12/19 PHP
php简单实现查询数据库返回json数据
2015/04/16 PHP
jQuery判断iframe中元素是否存在的方法
2013/05/11 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
jQuery实现dialog设置focus焦点的方法
2015/06/10 Javascript
jQuery旋转木马式幻灯片轮播特效
2015/12/04 Javascript
Vue.js:使用Vue-Router 2实现路由功能介绍
2017/02/22 Javascript
nodejs学习笔记之路由
2017/03/27 NodeJs
react-native中ListView组件点击跳转的方法示例
2017/09/30 Javascript
JavaScript console的使用方法实例分析
2020/04/28 Javascript
微信小程序实现列表的横向滑动方式
2020/07/15 Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
2020/09/08 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
[03:17]2014DOTA2 国际邀请赛中国区预选赛 四强专访
2014/05/23 DOTA
[48:29]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS KG
2018/03/31 DOTA
详解python中的Turtle函数库
2018/11/19 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
2019/06/14 Python
Python实现微信翻译机器人的方法
2019/08/13 Python
浅谈pytorch池化maxpool2D注意事项
2020/02/18 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
keras 实现轻量级网络ShuffleNet教程
2020/06/19 Python
解决python对齐错误的方法
2020/07/16 Python
Mytheresa英国官网:拥有160多个奢侈品品牌
2016/10/09 全球购物
NHL官方在线商店:Shop.NHL.com
2020/05/01 全球购物
智乐游戏测试笔试题
2014/05/21 面试题
sleep()方法和wait()方法的区别是什么
2012/11/17 面试题
文史专业毕业生自荐信
2013/11/17 职场文书
个人简历自我评价
2014/01/06 职场文书
大学生会计职业生涯规划范文
2014/02/28 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
走群众路线学习心得体会
2014/10/31 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
百年校庆宣传标语口号
2015/12/26 职场文书
你真的了解redis为什么要提供pipeline功能
2021/06/22 Redis
flex弹性布局详解
2022/03/20 HTML / CSS
Golang 切片(Slice)实现增删改查
2022/04/22 Golang