参考

Youtube – #3 JavaScript Loading Strategies (async and defer) | JavaScript Full Tutorial

no async no defer

当游览器 parse HTML 遇到 <script src> 时, 它会去 download 这个 file, 这时会停止 parse HTML. 一直等到这个 JS file download 完毕.

然后游览器会开始 execute 这个 JS file 代码. executed 后继续 parse HTML.

parse HTML > download js > waiting download completed > execute js > continue parse HTML

async

async 是异步 download, 当游览器 download JS file 时, 它不会等, 而是继续 parse HTML.

等到这个 file download 完毕, 就暂停 parse HTML, 去 execute JS file. executed 后继续 parse HTML.

有一点需要特别注意, 如果有多个 async file, 游览器不会管它们的顺序, 哪个先 download 完毕就马上 execute.

parse HTML > download a.js (no waiting) > parse HTML > download b.js (no waiting) > parse HTML >

b.js finish download > execute b.js > parse HTML > a.js finish download > execute.a.js > parse HTML

defer

defer 也是异步 download, 但它 download 完毕之后并不会马上 execute. 而是等到 parse HTML 结束后才 execute.

而已它 execute 是讲究顺序的.

parse HTML > download a.js (no waiting) > parse HTML > download b.js (no waiting) > parse HTML >

b.js finish download (no run first) > parse HTML > a.js finish download (no run first) > parse HTML finish > execute.a.js (依据顺序) > execute b.js.

async defer together?

看到 facebook 的 sample code 是 2 给一起用. 于是查了一下

stackoverflow – Can you use both the async and defer attributes on a HTML script tag?

原来是为了兼容游览器, 有些游览器不支持 async. 注意是当你想 async 的时候但怕不支持所以才加上 defer. 而不是反过来哦.

async 如果运行的到, 那么 defer 就被无视了.

关于 DOMContentLoaded

参考: 详解 DOMContentLoaded

HTML parse 完以后, DomContentLoaded 会等到所有 defer download 完同时 execute 完以后才触发.

但是它不会去等待 async. HTML parse 完, 如果还有 async 没用在 download, 它不管, 会直接去触发 DomContentLoaded.

总结:

1. 以前需要把 JS 写到 body 最后面, 现在被 async defer 取代了.

2. async defer 用其中一个就可以了.

3. defer 是最常用的, 因为通常在乎顺序

4. async 的一个使用场景是 analytics 因为希望尽快做 tracking, defer 有点慢了.

Chrome Bug ? JS run before CSS render when using defer + compression

23-04-2022 遇到一个奇葩情况.

JavaScript 执行的比 CSS download file 还早. 这导致 computedStyle 获取到错误的值

它需要几个情况一起才会发生.

1. Chrome version 100.0.4896.127

2. script with defer

3. script with compression (br)

做了一个 ASP.NET Core 的测试环境

开启 compression, 当 download CSS 时刻意让它慢

HTML

Javascript 执行就 log

用 Firefox 测试效果是, 5 秒后 log

用 Chorme 是马上 log.

如果关闭 compression 效果则 Firefox 和 Chrome 都是 5 秒后 log.

如果把 defer 拿掉, 同时把 script 移动到 </body> 前, Firefox 和 Chrome 都是 5 秒后 log.

结论就是 Chrome + defer + compression 会导致 log 提前执行 (哪怕你放到 </body> 前).

所以建议暂时不要使用 defer, 改成把 script 放到 </body> 前.

HTML – script async defer的更多相关文章

  1. script async / defer

    script async / defer preload / prefetch https://abc.xgqfrms.xyz/ https://javascript.info/script-asyn ...

  2. [转]script之defer&async

    html5中script的async属性 我兴奋于html5的原因之一是一些久久未能实现的特性现在可以真正运用于实际项目中了. 如我们使用placeholder效果蛮久了但是那需要javascript ...

  3. 【HTML5 】<script>元素async,defer异步加载

    原文地址:HTML5′s async Script Attribute原文日期: 2010年09月22日翻译日期: 2013年08月22日 (译者注: 异步加载,可以理解为无阻塞并发处理.) (译者再 ...

  4. HTML5 <script>元素async,defer异步加载

    原文地址:HTML5′s async Script Attribute原文日期: 2010年09月22日翻译日期: 2013年08月22日 (译者注: 异步加载,可以理解为无阻塞并发处理.) (译者再 ...

  5. script的defer和async

    我们常用的script标签,有两个和性能.js文件下载执行相关的属性:defer和async defer的含义[摘自https://developer.mozilla.org/En/HTML/Elem ...

  6. <script>, <script async>, <script defer> 三种标签的区别

    <script>, <script async>, <script defer> 三种标签的区别 <script>标签 阻塞html parsing 脚 ...

  7. script async 和script defer的区别

    浏览器对js文件的操作主要有两部分:下载和执行: js文件下载在有些浏览器中是并行的,在有些浏览器中是串行的,如:IE8.firefox3.chrome2都是串行下载的: 执行在所有浏览器中默认是阻塞 ...

  8. HTML中<script>的defer属性与async属性

    defer 属性会在 DOMLoaded 事件之前完成异步加载,加载不会阻塞 DOM 解析,并且 script 的顺序会按照 DOM 中的顺序加载. async 属性就是异步加载,没有什么顺序的保证.

  9. <script> 的defer和async

    <script src="../file.js" async="async"></script> file.js---- 仅仅只有ale ...

  10. script async和defer

    1.没有async和defer,html解析时遇到script标签,会先去下载js文件,文件加载完成立即执行,执行完了再开始解析后面的html,是一个顺序流的过程 2.async,加载和渲染后续文档元 ...

随机推荐

  1. 算法金 | 秒懂 AI - 深度学习五大模型:RNN、CNN、Transformer、BERT、GPT 简介

    1. RNN(Recurrent Neural Network) 时间轴 1986年,RNN 模型首次由 David Rumelhart 等人提出,旨在处理序列数据. 关键技术 循环结构 序列处理 长 ...

  2. 高程读后感(四)— 关于BOM本人容易忽略的知识点总结

    目录 window对象 window对象上属性及方法 超时调用setTimeout和间歇调用setInterval BOM location对象及其位置操作 history对象 window对象 wi ...

  3. oeasy教您玩转vim - 26 - 缩进设置

    ​ 缩进设置 回忆上节课内容 这次了解了颜色的细节 设置 256 色模式 :set t_Co=256 然后确定了具体的各种颜色 还可以生成网页 :TOhtml 还有什么好玩的么? ​ 缩进设置 ​ 在 ...

  4. Python 基于pymongo操作Mongodb学习总结

    实践环境 Python 3.6.4 pymongo 4.1.1 pymongo-3.12.3-cp36-cp36m-win_amd64.whl 下载地址:https://pypi.org/simple ...

  5. Python 实现Excel和TXT文本格式之间的相互转换

    Excel是一种具有强大的数据处理和图表制作功能的电子表格文件,而TXT则是一种简单通用.易于编辑的纯文本文件.将Excel转换为TXT可以帮助我们将复杂的数据表格以文本的形式保存,方便其他程序读取和 ...

  6. c++ 17 demo

    1 // Cpp.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. 2 // 3 4 #include <iostream> 5 #includ ...

  7. 解锁Nginx日志的宝藏:GoAccess——你的实时、交互式Web日志分析神器!

    在当今数字化的时代,网站的流量和用户行为数据就像是一座蕴藏着无尽秘密的宝藏.而如何有效地挖掘和分析这些数据,成为了许多网站管理者和开发者头疼的问题.GoAccess,一款开源的实时Web日志分析工具, ...

  8. 从web2的用户名密码登录到web3的钱包签名认证

    Web2 都有哪些常用的认证场景 早期我们使用网页类 Web2 应用时,大多采用账号 + 密码的认证方式访问.为了方便很多网站设置的都是相同的密码(这很不安全). 随着移动应用的普及,慢慢我们习惯了手 ...

  9. 【Shiro】07 散列算法 & 凭证配置

    [散列算法概述] 用于生成数据的摘要信息,不可逆算法,用于存储密码或者密文数据. 常见散列算法类型:MD5.SHA 一般进行散列时提供一个"盐",即系统知道的"干扰数据& ...

  10. 感慨!美国人的大学课程搞的确实蛮好的,不是那种刻板读书的感觉 —— 课程:SERVICE-ORIENTED COMPUTING AND SYSTEM INTEGRATION: SOFTWARE, IOT, BIG DATA, AND AI AS SERVICES

    无意间看到了一个美国人的课程,使用的教材:<SERVICE-ORIENTED COMPUTING AND SYSTEM INTEGRATION: SOFTWARE, IOT, BIG DATA, ...