首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >script 的三种加载方式 (async, defer)

script 的三种加载方式 (async, defer)

作者头像
Cell
发布于 2022-02-25 09:19:17
发布于 2022-02-25 09:19:17
2.7K0
举报
文章被收录于专栏:Cell的前端专栏Cell的前端专栏

Note

JS 的加载分为两个部分:下载和执行。 浏览器在执行 HTML 的时候如果遇到<script>时会停止页面的渲染,去下载和执行 js 的文件直接遇见</scirpt>会继续渲染页面。故浏览器在执行 js 文件的时候浏览器表现为一片空白,为了解决这个问题 ECMAScript 定义了 defer 和 async 两个属性用于控制 JS 的下载和执行。

不带任何属性

同步模式,又称阻塞模式,我们平时使用的最多的一种方式。当浏览器解析到<script>标签时,浏览器会停止解析其后的内容,而优先下载脚本文件,并执行其中的代码,是个同步阻塞的过程。 一般建议把<script>标签放在<body>结尾处,这样尽可能减少页面阻塞。 而如果想要异步执行 script,则可以给其加上 async 或 defer 属性。

1

<script>

defer

defer 属性在 HTML 解析期间异步下载文件,并且只在 HTML 解析完成后才执行它。对于 defer,我们可以理解是将外链的 js 放在了页面底部。js 的加载不会阻塞页面的渲染和资源的加载。不过 defer 会按照原本的 js 的顺序执行,所以如果前后有依赖关系的 js 可以放心使用。

1

<script defer>

async

async 属性会在 HTML 解析期间异步下载文件,并在完成下载后立即暂停 HTML 解析器去执行 script 中的代码。在执行过程中浏览器处于阻塞状态,响应不了任何需求。如果 js 前后有依赖性,用 async,就很有可能出错。

1

<script async>

区别

相同点

  1. 加载文件时不阻塞页面渲染
  2. 对于 inline 的 script 无效(只适用有src的外部 js)
  3. 使用这两个属性的脚本中不能调用 document.write 方法
  4. 有脚本的 onload 的事件回调

区别点

  1. html4.0 中定义了 defer;html5.0 中定义了 async
  2. 浏览器支持不同
  3. 每一个 async 属性的脚本都在它下载结束之后立刻执行,同时会在 window 的 load 事件之前执行。所以就有可能出现脚本执行顺序被打乱的情况;每一个 defer 属性的脚本都是在页面解析完毕之后,按照原本的顺序执行,同时会在 document 的 DOMContentLoaded 之前执行。

那么这三种方式各在什么情况下使用呢?

通常来说,尽可能使用async,然后是defer,最后不使用属性。 并遵循以下规则:

  • 如果脚本是模块化的,并且不依赖于任何脚本,则使用async
  • 如果脚本依赖于或依赖于另一个脚本,则使用defer
  • 如果脚本很小并且有async脚本依赖该脚本,则不加属性。

兼容性

  1. Internet Explorer 10、Firefox、Opera、Chrome 和 Safari 支持 async 属性。
  2. 所有主流浏览器都支持 defer 属性。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
浅谈script标签中的async和defer
浅谈script标签中的async和defer script标签用于加载脚本与执行脚本,在前端开发中可以说是非常重要的标签了。 直接使用script脚本的话,html会按照顺序来加载并执行脚本,在脚本加载&执行的过程中,会阻塞后续的DOM渲染。 现在大家习惯于在页面中引用各种的第三方脚本,如果第三方服务商出现了一些小问题,比如延迟之类的,就会使得页面白屏。 好在script提供了两种方式来解决上述问题,async和defer,这两个属性使得script都不会阻塞DOM的渲
贾顺名
2018/04/12
2.4K0
浅谈script标签中的async和defer
浅谈script标签中的async和defer
现在大家习惯于在页面中引用各种的第三方脚本,如果第三方服务商出现了一些小问题,比如延迟之类的,就会使得页面白屏。 好在script提供了两种方式来解决上述问题,async和defer,这两个属性使得script都不会阻塞DOM的渲染。 但既然会存在两个属性,那么就说明,这两个属性之间肯定是有差异的。
贾顺名
2019/12/05
1.2K0
<script>属性async和defer的区别
async:可选。表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或 等待加载其他脚本。只对外部脚本文件有效。
TimothyJia
2019/11/12
8470
async 和 defer 的区别
要注意的是,带有 src 的 <script> 元素中不应该再包含额外的代码,如果包含了嵌入的代码,则只会下载外部文件,嵌入的代码不会执行。
李振
2021/11/26
5.4K2
async 和 defer 的区别
Script标签的async和defer
之前有写过HTML页面渲染过程,知道了JavaScript是会阻塞DOM解析的,所以我们会把script标签放到底部防止阻塞HTML解析。其实script还有两个属性,async和defer,也是可以使得JavaScript和DOM和css同步加载。
wade
2020/04/24
7490
你不知道的 script 标签的 defer 与 async 属性
我持续组织了近一年的源码共读活动,感兴趣的可以 点此扫码加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外:目前建有江西|湖南|湖北籍前端群,可加我微信进群。
若川
2022/11/11
9600
你不知道的 script 标签的 defer 与 async 属性
再谈DOMContentLoaded与渲染阻塞—分析html页面事件与资源加载
浏览器的多线程中,有的线程负责加载资源,有的线程负责执行脚本,有的线程负责渲染界面,有的线程负责轮询、监听用户事件。
周陆军
2018/05/22
5.4K0
Script 标记的 defer 和 async 属性说明
Script 标记的 defer 和 async 属性可能会显著影响页面加载的性能, 总结说明一下。
beginor
2020/08/07
8830
JS篇(022)-<script>标签的 defer 和 asnyc 属性的作用以及二者的区别?
无论 <script> 标签是嵌入代码还是引用外部文件,只要不包含 defer 属性和 async 属性(这两个属性只对外部文件有效),浏览器会按照 <script> 的出现顺序对他们依次进行解析,也就是说,只有在第一个 <script> 中的代码执行完成之后,浏览器才会执行第二个 <script> 中的代码,并且在解析时,页面的处理会暂时停止。
齐丶先丶森
2022/12/05
9650
JS篇(022)-<script>标签的 defer 和 asnyc 属性的作用以及二者的区别?
高性能Javascript--脚本的无阻塞加载策略
Javascript在浏览器中的性能,可以说是前端开发者所要面对的最重要的可用性问题。 在Yahoo的Yslow23条规则当中,其中一条是将JS放在底部 。原因是,事实上,大多数浏览器使用单进程处理U
Sb_Coco
2018/05/28
1.1K0
JS异步加载的三种方式
同步模式:又称阻塞模式,会阻止浏览器的后续处理,停止后续的解析,只有当当前加载完成,才能进行下一步操作。所以默认同步执行才是安全的。 但这样如果js中有输出document内容、修改dom、重定向等行为,就会造成页面堵塞。所以一般建议把<script>标签放在<body>结尾处,这样尽可能减少页面阻塞。
青梅煮码
2023/01/14
3.6K0
浅析script 标签的 async 和 defer 属性
前端当然要从 HTML 开始,今天来聊聊在 script 标签中加上 async/defer 时的功能及差异。
疯狂的技术宅
2020/11/03
1.3K0
浅析script 标签的 async 和 defer 属性
JavaScript文件加载优化
企鹅号小编
2018/01/04
1.4K0
script 中 defer 和 async 区别
没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该 script 标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行。
用户9914333
2022/07/22
5220
script 中 defer 和 async 区别
Hexo异步加载方案
在博客魔改过程中,不可避免的会引入大量的第三方脚本(js),而基于页面读取js的加载顺序,每当浏览器在加载html的过程中遇到<script>js代码片段</script>这样的标签时,浏览器会暂停继续构建html,而是优先执行当前的js脚本,等执行完毕后再继续加载后面的html。
Akilar
2021/06/11
1.9K0
defer和async的区别
注意:从实用角度来说呢,首先把所有脚本都丢到 </body> 之前是最佳实践,因为对于旧浏览器来说这是唯一的优化选择,此法可保证非脚本的其他一切元素能够以最快的速度得到加载和解析。
老猫-Leo
2023/12/11
2180
defer和async的区别
Js文件异步加载
浏览器中渲染引擎与Js脚本引擎是互斥的,在浏览器开始渲染页面时,如果遇到<script>标签,会停止渲染当前页面,也就是说在脚本加载与执行的过程中会阻塞页面的渲染,在网速较差的环境下可能会出现浏览器页面假死的情况,这也就是尽量将<script>文件放置于<body>后的原因,Js文件异步加载就是使浏览器加载外部Js脚本文件时不阻塞渲染线程,这称为非阻塞模式加载,当然加载完成之后解析执行Js脚本时必须与渲染引擎互斥,解析执行Js脚本的时机取决于异步加载Js的方式。
WindRunnerMax
2020/08/27
11.8K0
在WebKit中并行加载外部脚本译:
作者:Tony Gentilcore 原文:http://webkit.org/blog/1395/running-scripts-in-webkit/ WebKit 正式版已经正式支持HTML5中<script>标签的 async 和 defer 属性了。如此一来,我们就能在不阻塞网页中其它元素下载的情况下,以异步方式下载JavaScript,从而大大提高了网页加载速度。 正常情况下,网页分析器检测到有外部脚本时,会暂停解析,并发起一个请求去下载该脚本,一直到这个脚本完全下载并执行之后解析才会继续进行。
小李刀刀
2018/03/02
2.2K0
script 标签的属性、事件的探究
有 async 没有 defer 时,会与渲染后续文档元素并行加载(加载过程不会阻塞 dom 解析),加载完自动执行(执行会阻塞 dom 解析)
Krry
2018/09/29
2K0
前端 实战项目·动态加载 JS 文件
对于 Vue、React 等框架开发的单页面应用,在某些页面开发特殊功能时经常需要依赖第三方 JS 文件,如果在全局引入 CDN 资源可能会加载冗余文件,此时最好使用动态加载方式。
数媒派
2022/12/01
6K0
相关推荐
浅谈script标签中的async和defer
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档