【HTML】defer 和 async 属性在 script 标签中分别有什么作用?

需要这两个属性的原因?

首先我们要知道的是,浏览器在解析 HTML 的过程中,遇到了 script 元素是不能继续构建 DOM 树的。

  • 它会停止解析构建,首先去下载 js 代码,并且执行 js 的脚本;
  • 只有在等到 js 脚本执行结束之后,才会继续解析 html,构建 DOM 树。

那为什么要这样做呢?

  • 因为 js 的作用之一就是操作 DOM,并且可以修改 DOM;
  • 如果等到 DOM 树构建完成并且渲染后再去执行 js,就会造成严重的回流重绘,影响页面性能;
  • 所以,在遇到 script 标签的时候,浏览器采取了先加载执行后构建 DOM 树的方案。

虽然是解决了回流和重绘的问题,但这又产生了新的问题!(解决一个问题产生了新的问题😂)

在现在的网页开发模式中(Vue、React),往往 js 脚本比 HTML 结构更“重”,需要加载和处理的时间更长。

这样就会导致页面的解析阻塞(在脚本完成下载、执行之前,用户在界面上什么都看不到)。

为了解决上面的问题,script 元素给我们提供了两个属性来处理:deferasync

defer 的作用

defer 翻译过来就是延迟的意思

defer 属性告诉浏览器不要等待脚本下载,而是继续解析 HTML、构建 DOM Tree。

  • 脚本会又浏览器来进行下载,但是不会阻塞 DOMTree 的构建过程;
  • 如果脚本提前下载好了,它会等待 DOM Tree 构建完成,在 DOMContentLoaded 事件之前执行 defer 中的代码。

下面举个例子:

我们创建了一个 defer.js 文件并在脚本执行的时候添加了 defer 属性,最后我们可以看到 DOMContentLoaded 会等待 defer 中的代码先执行完成。

在这里插入图片描述
在这里插入图片描述
另外我们要注意的是,多个 defer 的脚本是可以保持顺序执行的。

在这里插入图片描述
在这里插入图片描述
从某种角度来说,defer 是可以提高页面性能的,并且推荐把带有 defer 属性的 script 标签放到 heade 元素中。

async 的作用

async 翻译过来是异步的意思

async 的特性和 defer 有些类似

  • 浏览器不会因为 async 脚本的下载而阻塞(和 defer 类似)
  • 但是在带有 async 属性的脚本会在下载完成后立即执行,并且不能保证在 DOMContentLoaded 之前或者之后执行,我们要知道在脚本执行的时候是会阻塞 DOMTree 的构建。
  • 还有就是 async 脚本是不能保证顺序的,它是独立下载、独立运行,不会等待其他脚本;

在这里插入图片描述
在这里插入图片描述

具体的执⾏时机图解

绿色-HTML 解析;黑色-停止 HTML 解析;黄色-脚本下载;棕色-脚本执行;
在这里插入图片描述

总结

script 标签的 defer 和 async 属性都是用来控制外部脚本的加载和执行方式的,他们对于改善页面加载非常有帮助。

但是他们的机制并不相同:

  • defer 下载不会阻止 DOM 的构建,但是在 DOMTree 构建完成后,在 DOMContentLoaded 事件之前执行,并且 defer 脚本的执行是有序的。
  • async 下载同样不会阻止 DOM 的构建,但是不会保证在 DOMcontentLoaded 之前或者之后执行,也不能保证顺序,它的每个脚本都是独立的。

所以他们的应用场景是这样的:

  • defer 通常用于需要在文档解析后操作 DOM 的 js 代码,并且对多个脚本文件有顺序要求
  • async 通常用于独立的脚本,对其他脚本,甚至对 DOM 没有依赖的脚本。

在现代化的框架开发中,已经不需要我们手动设置 async 和 defer 了,在使用脚手架的时候,一遍会根据我们需要自动加上 defer 属性,某些特殊场景下,比如第三方分析工具或者是广告追踪脚本等,需要我们自己加上 async 属性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/881418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI训练 | 如何控制单篇文章不传给AI训练

随着生成式AI技术的普及,越来越多的企业开始使用AI工具来提升效率,但与此同时,关于AI训练的争议也越来越多。比如,2个月前字节跳动和WPS因为内容因为AI训练,引发了创作者的广泛讨论。这种对未经许可内容被“喂养”AI模…

draw.io创建自定义形状

Create custom shapes in draw.io using the text editor Reference draw怎么创建和编辑复杂的自定义形状 https://blog.csdn.net/u012028275/article/details/113828875 Create custom shapes in draw.io using the text editor

LeetCode讲解篇之377. 组合总和 Ⅳ

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 总和为target的元素组合个数 可以由 总和为target - nums[j]的元素组合个数 转换而来,其中j为nums所有元素的下标 而总和target - nums[j]的元素组合个数 可以由 总和为target - nums[j] - nums[k]的…

C++模版SFIANE应用踩的一个小坑

一天一个C大佬同事&#xff0c;突然截图过来一段代码&#xff1a;这写的啥呀&#xff0c;啰里吧嗦的&#xff0c;这个构造函数模板参数T1感觉是多余的呀 template<class T> class TestClass { public:TestClass(){}//函数1template<class T1 T, std::enable_if_t<…

第三届“讯方杯”大赛常见问题解答

9月20日&#xff0c;第三届“讯方杯”全国大学生信息技术应用及创新大赛正式拉开帷幕。自大赛报名启动以来&#xff0c;全国各大高校热烈响应、广泛参与。为了更好地服务于各参赛团队&#xff0c;大赛组委会针对收集到的各类常见问题&#xff0c;整理了热点问答集锦&#xff0c…

传感器模块编程实践(四)舵机+MPU6050陀螺仪模块融合云台模型

文章目录 一.概要二.实验模型原理1.硬件连接原理框图2.控制原理 三.实验模型控制流程四.云台模型程序五.实验效果视频六.小结 一.概要 云台主要用来固定摄像头。准确地说&#xff0c;云台是一种可以多角度调节的支撑设备&#xff0c;类似于人的脖子可以支撑着脑袋&#xff0c;…

Leetcode 删除链表倒数第 N 个节点

算法思想&#xff1a; 使用了双指针法。下面是详细的算法思想&#xff1a; 1. 引入虚拟头节点&#xff08;dummy node&#xff09; 为了处理链表的一些边界情况&#xff08;比如删除头节点&#xff09;&#xff0c;我们在链表的头部引入了一个虚拟节点 dummy&#xff0c;并让…

【AAOS】Android Automotive 9模拟器源码下载及编译

源码下载 repo init -u https://android.googlesource.com/platform/manifest -b android-9.0.0_r61 repo sync -c --no-tags --no-clone-bundle 源码编译 source build/envsetup.sh lunch aosp_car_x86_64-userdebug make -j8 运行效果 emulator Home界面 MAP All apps S…

ATX和ITX有什么区别?

ATX&#xff08;Advanced Technology eXtended&#xff09;和 ITX&#xff08;Information Technology eXtended&#xff09;是两种常见的主板规格&#xff0c;它们之间存在几个关键的区别&#xff0c;主要体现在版型尺寸、配置功能以及适用范围上。 ATX主板与ITX主板的对比 …

前端环境搭建一览记录

文章目录 写在前面Nodejs下载Nodejs介绍Nodejs下载方式nvm安装:安装Homebrew&#xff08;安装器&#xff09;(打开终端&#xff0c;输入下面的脚本)安装nvm验证安装是否成功配置环境内容查看环境内容刷新配置 nvm 使用如何使用nvm ls 查看当前安装的版本nvm use versionId 切换…

精益生产现场管理和改善:从知识到实操的落地

在制造业的广阔天地中&#xff0c;精益生产作为一种追求浪费最小化、效率最大化的生产管理模式&#xff0c;已成为众多企业转型升级的关键路径。本文&#xff0c;深圳天行健企业管理咨询公司将从精益生产现场管理和改善的理论知识出发&#xff0c;深入探讨其从理念导入到实操落…

【安装JDK和Android SDK】

安装JDK和Android SDK 1 前言2 下载2.1 下载途径2.2 JDK下载和安装2.2.1 下载2.2.2 安装并配置环境变量2.2.3 验证 2.3 SDK下载和安装2.3.1 下载2.3.2 安装2.3.3 环境变量配置2.3.4 验证 1 前言 在软件开发中&#xff0c;Android应用开发通常使用Android Studio&#xff0c;但…

Windows 搭建 Gitea

一、准备工作 1. 安装 Git&#xff1a;Gitea 依赖 Git 进行代码管理&#xff0c;所以首先需要确保系统中安装了 Git。 下载地址&#xff1a;https://git-scm.com/downloads/win 2. 安装数据库&#xff08;可选&#xff09; 默认情况下&#xff0c;Gitea 使用 SQLite 作为内…

基于STM32的简易交通灯proteus仿真设计(仿真+程序+设计报告+讲解视频)

基于STM32的简易交通灯proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;C0091 **1.**主要功能 功能说明&#xff1a; 以STM32单片机和数码管、LED灯设计简易交通…

无人自助超市系统小程序源码开发

随着科技的飞速发展和消费模式的转变&#xff0c;无人自助超市作为一种新兴的商业模式&#xff0c;以其便捷性、高效率以及对“体验式购物”的完美诠释&#xff0c;受到了广泛关注。本文renxb001将深入探讨无人自助超市系统小程序源码开发的核心环节和技术要点。 一、系统需求分…

红帽7—Mysql路由部署

MySQL Router 是一个对应用程序透明的InnoDB Cluster连接路由服务&#xff0c;提供负载均衡、应用连接故障转移和客户端路 由。 利用路由器的连接路由特性&#xff0c;用户可以编写应用程序来连接到路由器&#xff0c;并令路由器使用相应的路由策略 来处理连接&#xff0c;使其…

Jedis多线程环境报错:redis Could not get a resource from the pool 的主要原因及解决办法。

本篇文章主要讲解&#xff0c;Jedis多线程环境报错&#xff1a;redis Could not get a resource from the pool 的主要原因及解决办法。 作者&#xff1a;任聪聪 日期&#xff1a;2024年10月6日01:29:21 报错信息&#xff1a; 报文&#xff1a; redis Could not get a resou…

云原生日志ELK( logstash安装部署)

logstash 介绍 LogStash由JRuby语言编写&#xff0c;基于消息&#xff08;message-based&#xff09;的简单架构&#xff0c;并运行在Java虚拟机 &#xff08;JVM&#xff09;上。不同于分离的代理端&#xff08;agent&#xff09;或主机端&#xff08;server&#xff09;&…

【斯坦福CS144】Lab5

一、实验目的 在现有的NetworkInterface基础上实现一个IP路由器。 二、实验内容 在本实验中&#xff0c;你将在现有的NetworkInterface基础上实现一个IP路由器&#xff0c;从而结束本课程。路由器有几个网络接口&#xff0c;可以在其中任何一个接口上接收互联网数据报。路由…

SpringBoot访问web中的静态资源

SpringBoot访问web中的静态资源&#xff0c;有两个方式&#xff1a; 1、SpringBoot默认指定了一些固定的目录结构&#xff0c;静态资源放到这些目录中的某一个&#xff0c;系统运行后浏览器就可以访问到 ① 关键是SpringBoot默认指定的可以存放静态资源的目录有哪些&#xff…