JavaScript中的两个延迟加载JS文件的属性anyn和defer

   defer

    HTML 4.01 <script>标签定义了 defer 属性。

    这个属性的用途是表明脚本在执行时不会影响页面的构造。

    也就是说,脚本会被延迟到整个页面都解析完毕后再运行。

    因此,在<script>元素中设置defer 属性,相当于告诉浏览器立即下载,但延迟执行。


    HTML5 规范要求脚本按照它们出现的先后顺序执行,因此第一个加载脚本会先于第二个加载脚本执行,而这两个脚本会先于 DOMContentLoaded 事件执行。

    在现实当中,延迟脚本并不一定会按照顺序执行,也不一定会在 DOMContentLoaded 事件触发前执行,因此最好只包含一个延迟脚本。
    前面提到过,
defer 属性只适用于外部脚本文件。这一点在 HTML5 中已经明确规定,因此支持HTML5 的实现会忽略给嵌入脚本设置的 defer 属性。 IE4IE7 还支持对嵌入脚本的 defer 属性,但IE8 及之后版本则完全支持 HTML5 规定的行为。
    IE4Firefox 3.5Safari 5 Chrome 是最早支持 defer 属性的浏览器。其他浏览器会忽略这个属性,像平常一样处理脚本。为此,把延迟脚本放在页面底部仍然是最佳选择。

   async

    HTML5 <script>元素定义了 async 属性。这个属性与 defer 属性类似,都用于改变处理脚本的行为。

    同样与 defer 类似, async 只适用于外部脚本文件,并告诉浏览器立即下载文件。

    但与 defer不同的是,标记为 async 的脚本并不保证按照指定它们的先后顺序执行。

    第二个加载的脚本文件可能会在第一个加载的脚本文件之前执行。

    因此,确保两者之间互不依赖非常重要。

    指定 async 属性的目的是不让页面等待两个脚本下载和执行,从而异步加载页面其他内容。
    为此,建议异步脚本不要在加载期间修改
DOM
    异步脚本一定会在页面的
load 事件前执行,但可能会在 DOMContentLoaded 事件触发之前或之后执行。

    支持异步脚本的浏览器有 Firefox 3.6Safari 5 Chrome


    因此在最新的HTML5标准下defer这个属性是会被忽略掉的、是无效的、除非你还需要兼容IE8以前的浏览器、这对当前大多数网页来说这是没有意义的。

    所以更推荐使用async、当然这不是最好的方式、因为你无法控制它的加载顺序、如果你的JS文件存在依赖关系的话,那将是一个非常糟糕的事情、我更喜欢使用动态创建script标签的方式来做延迟加载,当然方式不止一种、希望你能找到自己喜欢的方式。如果还有什么不懂可以来联系我


    by潇潇暮雨






发表评论