zoukankan      html  css  js  c++  java
  • 【HTML5 】<script>元素async,defer异步加载

    原文地址:HTML5′s async Script Attribute
    原文日期: 2010年09月22日
    翻译日期: 2013年08月22日

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

    (译者再注: 建议使用 defer,但是经测试发现 defer 属性对页面内的script无效,没有时序差别.只对外部 js文件生效)

    async - HTML属性

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

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

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

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

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


    async 与 defer 的差别

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

     
    1. <script async src="myAsyncScript.js" onload="myInit()"></script>  
    2. <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秒钟。
    普通内联script执行时序

    同样的例子,但这次我们指定了script的 defer 属性.因为当defer脚本下载的时候,其他操作可以并行执行,所以大概快了1倍。

    使用defer异步加载的执行时序

    ------------------------------------

    哪些浏览器支持async 和 defer
    同样是上面引用的文章中提到:

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

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

  • 相关阅读:
    基于NIO的服务器模型
    Thinking in java 笔记三
    Thinking in java 笔记二
    Thinking in java 笔记一
    Windows 上的苹果 mac Time Machine 时间机器免费替代品 FreeFileSync 操作指南
    扫描仪扫描文件处理-ABBYY对扫描版PDF文字加黑加粗、去除背景漂白
    扫描仪扫描文件处理-Photoshop批处理无响应问题
    阅读-Calibre Library转PDF、EPUB配置
    扫描仪扫描文件处理-图像扫描加工到生成PDF步骤简述[JAVA版]
    扫描仪扫描文件处理-纸书切割扫描步骤
  • 原文地址:https://www.cnblogs.com/yingsong/p/5396858.html
Copyright © 2011-2022 走看看