【前端面试专栏】<script> 脚本以及 <link> 标签对 DOM 的影响

news2024/10/7 20:27:58

🐱 个人主页:不叫猫先生,公众号:前端舵手
🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀!
💫优质专栏:vue3+vite+typeScript从入门到实践
📢 资料领取:前端进阶资料可以找我免费领取
🔥 摸鱼学习交流:我们的宗旨是在「工作中摸鱼,摸鱼中进步」,期待大佬一起来摸鱼(文末有我wx或者私信)

在这里插入图片描述

目录

  • script脚本对DOM的影响
    • 1、普通脚本
    • 2、defer,
    • 3、async
  • link标签对DOM的影响
    • 1、link标签不会阻塞DOM解析但会阻塞DOM渲染
    • 2、link标签会阻塞JS执行
      • 案例一
      • 案例二
    • 3、link和@import的区别

script脚本对DOM的影响

当HTML解析器解析HTML,如果遇到script标签,普通的script标签会暂停对DOM解析渲染,因为该脚本可能会修改DOM。
这里有三种情况:普通脚步、defer、async。 defer、async只对外联script脚本文件有效, 内联script脚本设置无效。

问: script标签总是会触发Paint吗?

回答:
script标签时,会触发一次Paint,浏览器会将script标签之前的元素渲染出来。但也并不是所有的script标签都会触发Paint。

  • head中的script标签是不会触发的,毕竟此时body还没有解析,触发Paint也看不到任何内容。
  • inline(内联:将代码直接嵌入到HTML文档的元素中,而不是通过外部文件引用的方式) 的 script也不会触发Paint。

因此,建议script标签放在body结束标签之前,这样不会不会阻塞页面整体内容的DOM解析和渲染。

1、普通脚本

  • 文档解析过程中,如果遇到普通脚本就会直接下载脚本,下载会阻止DOM的解析渲染
  • 如果是多个脚本,则并行下载,不论哪个先下载完,都要按HTML中的顺序执行,即使后面的比前面的先下载完,也要等前面的执行完才能执行
  • 执行脚本会阻止页面的解析渲染
  • 执行完脚本继续页面的解析渲染
  • 执行完script脚本和页面解析渲染完, 才会依此触发DOMContentLoadedloaded事件

2、defer,

  • 文档执行时,当遇到有defer属性的script标签时,则脚本的下载则在后台运行,下载不会阻止DOM解析渲染
  • 多个defer属性的script标签,则在后台并行下载
  • 脚本的执行需要等到页面解析完成才能进行
  • 当页面解析渲染完毕后, 会等到所有的defer脚本下载完毕并按照顺序执行,执行完毕后会触发DOMContentLoaded事件。
  • 如果defer脚本下载较慢,在下载完前, 页面解析渲染已完毕; 等所有的defer脚本下载完后, 才按照顺序执行defer脚本。执行完毕后会触发DOMContentLoaded事件。

3、async

  • 文档解析时,当遇到有async属性的script标签时,则脚本的下载则在后台运行,下载不会阻止DOM解析渲染
  • 多个async属性的script标签,则在后台同时并行下载
  • async脚本的执行会阻止页面的解析渲染
  • 遵循先下载完先执行,执行不按照HTML页面的中脚本顺序
  • async脚本的下载和执行不计入DOMContentLoaded事件统计。

link标签对DOM的影响

1、link标签不会阻塞DOM解析但会阻塞DOM渲染

link标签并不阻塞DOM的解析,但会阻塞DOM的渲染。浏览器并行解析生成DOM Tree 和 CSSOM Tree,当两者都解析完毕,才会生成render tree,页面才会渲染。所以应尽量减小引入样式文件的大小,提高首屏展示速度。
注意:案例中CSS资源为外网资源,所以并不会直接就加载出来,可以在页面看到渲染的过程,当然可以直接开vpn,css资源几乎秒加载,页面也秒渲染


<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
	<script>
		setTimeout(() => {
			console.log(document.getElementById('num'));
		}, 0);
		document.addEventListener('DOMContentLoaded', () => {
			console.log('dom parse done');
		})
	</script>
	<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.css">
</head>
<body>
	<div id="num">
		i am content a.
	</div>
	<div>
		i am content b.
	</div>
</body>
</body>
</html>

初始加载页面的时候,控制台打印出来两条数据,但是页面并没渲染,此时CSS资源正在加载中
在这里插入图片描述
之后CSS资源一直加载,直到加载失败,页面才渲染完成,说明,link标签加载CSS资源时阻止了页面渲染
在这里插入图片描述

2、link标签会阻塞JS执行

JS运行时,有可能会请求样式信息,如果此时还没有加载和解析样式,js就有可能会得到错误的回复,产生很多问题。因此浏览器在link标签的加载和解析过程中,会禁止脚本运行。

案例一

<!DOCTYPE html>
<html lang="en">
<head>
	<tilte>title</title>
		<script>
			console.log(Date.now());
		</script>
		<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.css">
		<script>
			console.log(Date.now());
		</script>
</head>
<body>
	<div id="num">
		i am content a.
	</div>
	<div>
		i am content b.
	</div>
</body>
</body>
</html>

初始页面加载,此时CSS资源正在加载中,所以body中的内容还没渲染出来,并且link标签下的script中的console也还未执行,所以说,link标签加载CSS资源时也阻塞的JS的执行
在这里插入图片描述
之后,因为CSS资源加载失败,所以开始执行下面的script,并且打印出console内容-当前时间。
在这里插入图片描述

案例二

<html>
<head>
    <tilte>title</title>
    <!--大文件,加载时间长-->
   <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.css">
</head>
<body>
    <div>
        i am content a.
    </div>
    <!--js小文件,加载时间短-->
    <script src='test.js'></script>
    <div>
        i am content b.
    </div>
</body>
</html>

页面初始加载时,CSS资源一直在加载,body中的script一直没有加载出来,可以看到控制台并没有打印任何东西。所以说link标签会阻止JS执行

在这里插入图片描述
当CSS资源加载完成或者加载失败后就执行了script脚本,可以看到控制台打印出来js执行完毕,且此时页面已经渲染出来
在这里插入图片描述

3、link和@import的区别

  • 用法:
<link href="a.css" rel="stylesheet" type="text/css">

<style>
@import url('b.css');
</style>
  • 功能上:link功能较多,可以定义 RSS、Rel 等,而@import只能用于加载 css;
  • 加载顺序:
    • link标签让浏览器知道这是个样式表文件,html的解析和渲染不会暂停,css文件的加载是同时进行的,这不同于在style标签里面的内置样式;@import添加的样式是在页面载入之后再加载,这可能会导致页面因重新渲染而闪烁。
    • @import会影响浏览器的并行下载,使得页面在加载时增加额外的延迟,增添了额外的往返耗时,而且多个@import可能会导致下载顺序紊乱。比如:
      一个css文件index.css包含了以下内容:@import url(“reset.css”),那么浏览器就必须先把index.css下载、解析和执行后,才下载、解析和执行第二个文件reset.css
  • DOM操作:link支持DOM操作改变样式,由于 DOM 方法是基于文档的,无法使用@import的方式插入样式
  • 兼容性:@import是 CSS2.1提出的语法,老版本的浏览器可能不支持;link标签作为 HTML 元素,不存在兼容性问题。

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

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

相关文章

解决方法:python: not found问题

一、问题 测试环境&#xff1a;Ubuntu22.04.1 在运行一些脚本文件的时候&#xff0c;报以下错误&#xff1a; ./build.sh: python: not found二、原因 python 可能被 python2 或者 python 3 代替了导致映射不到。 三、解决方法 查看所有的 python 映射 ls -l /usr/bin/py…

现代化个人博客系统 ModStartBlog v7.7.0 博客关键词优化,附件上传重构

现代化个人博客系统 ModStartBlog v7.7.0 博客关键词优化&#xff0c;附件上传重构 ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基…

【电路原理学习笔记】第2章:电压、电流和电阻:2.5 电阻

第2章&#xff1a;电压、电流和电阻 2.5 电阻 当固体导体中有电流时&#xff0c;自由电子在该材料中运动&#xff0c;有时会与原子发生碰撞。这些碰撞使电子失去一些能量&#xff0c;因此它们的运动会受到限制。碰撞越多&#xff0c;电子的流动就越受限制。这一限制因材料类型…

基于Java+Swing+mysql实现垃圾分类管理系统

基于JavaSwingmysql实现垃圾分类管理系统 一、系统介绍二、功能展示1.登陆2.社区管理3.设备管理4.垃圾管理 三、其它1.其他系统实现2.获取源码 一、系统介绍 该系统实现了 管理员:系统登陆、社区管理、设备管理、垃圾管理 小区负责人&#xff1a;查看垃圾分类信息、垃圾站信息…

【雕爷学编程】Arduino动手做(136)---0.91寸OLED液晶屏模块2

0.91寸OLED液晶屏显示模块参数 驱动芯片&#xff1a;SSD1306 支持接口&#xff1a;I2C 显示颜色&#xff1a;白色 高分辨率&#xff1a; 12832 可视角度&#xff1a;大于160 工作电压&#xff1a;3.3V / 5V 模块大小&#xff1a;36 x 12.5&#xff08;mm&#xff09; 项目之三&…

2022年4月自写json转table记录

表头属性 属性名描述类型默认值key 设置字段名。通常是表格数据列的唯一标识 string-label 设置列的标题。 string-width 设置列宽。若不填写&#xff0c;则自动分配&#xff1b;若填写&#xff0c;则支持值为&#xff1a;数字、百分比。如&#xff1a; width: 200 / width: 30…

mysql的两种安装方式(yum在线安装和通用二进制)

文章目录 msqly的安装一、yum在线安装二、通用二进制安装mysql msqly的安装 一、yum在线安装 yum是一种在线安装方式&#xff0c;通过官网网址在linux下载安装 首先是配置一个yum安装源 yum install http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm也…

基于STM32单片机的智能家居烟雾温度火灾防盗报警的设计与实现

功能介绍 以STM32单片机作为主控系统&#xff1b;LCD1602液晶显示屏来显示显示测得的值&#xff1b;SR501人体红外感应是否有人进行防盗&#xff1b;通过烟雾传感器MQ-2获取前的烟雾值&#xff1b;通过DHT11温湿度传感器来获取当前的温湿度&#xff1b;所有的信息通过通过esp82…

几行代码教你轻松完成超大模型推理:LLaMA-30B+TITAN RTX*4+accelerate

是不是苦于没有ChatGPT的API key或者免费的token而无法愉快地和它玩耍&#xff1f;想不想在有限的计算资源上部署大模型并调戏大模型&#xff1f;&#xff1f;想不想解锁大模型的除了对话之外的其它功能&#xff1f;&#xff1f;&#xff1f;几行代码教你搞定如何在有限的计算资…

Devops系列三(拉取私库的helm chart,将java应用发布部署至k8s的示例)

一、说在前面的话 本文是紧接上文&#xff0c;上面已准备好了helm chart&#xff0c;接下来就是在K8S的kubectl执行部署。 二、使用helm部署 1、在kubectl添加helm 私有repo [adminjenkins]$ helm repo list Error: no repositories to show[adminjenkins]$ helm repo add …

github Copilot使用及代理设置

使用前先保证自己能正常访问github.com&#xff0c;找个科学上网工具 找到系统的hosts文件做个配置&#xff0c;在https://www.ipaddress.com/ 中搜索github.com和api.github.com 140.82.112.4 github.com 140.82.113.6 api.github.com 我的搜索完是上面两个ip&#xff0c;加入…

港联证券|新动向!A股“定点”公告越来越多,大订单透露高景气

近年来&#xff0c;A股商场发布“定点”公告的上市公司越来越多&#xff0c;近三年尤为显着。 需求阐明的是&#xff0c;本文中此类“定点”公告包括定点&#xff08;意向&#xff09;书、定点通知&#xff08;书&#xff09;、定点信&#xff08;函&#xff09;等&#xff0c;…

Devops系列四(使用argocd部署java应用到k8s容器)

一、说在前面的话 上文已为我们准备好了以下内容&#xff1a; 制作java应用的docker镜像&#xff0c;并推送至镜像仓库上传helm yaml代码至gitlab仓库&#xff08;此gitlab和java应用所在的gitlab可以独立&#xff0c;也可以在一起&#xff0c;但是不宜在同一个工程&#xff…

C#:AES的加密解密,用于明文加密

大白话理解&#xff1a;将明眼能看到的字符给用另一种读不懂的语言给翻译&#xff0c;就像是摩斯密码……就像base64加密&#xff0c;都有异曲同工之妙。 建一个新的类&#xff08;这里放了aes加密解密的方法&#xff09; public static class AesPassword{/// <summary&g…

解锁Nginx的奇幻世界:入门

文章目录 一 Nginx简介1.1 C10k问题1.2 Nginx 二 Nginx的作用2.1 反向代理2.2 方向代理演示2.3 负载均衡2.4 动静分离 三 Nginx的安装3.1 windows环境 一 Nginx简介 1.1 C10k问题 C10k问题指的是在一个服务器端同时处理成千上万&#xff08;10,000&#xff09;个并发连接的能力…

【论文精读】RA-MVSNet:Multi-View Stereo Representation Revisit: Region-Aware MVSNet

今天读的是一篇发表在CVPR2023上的文章&#xff0c;作者来自浙大与阿里巴巴。 文章链接&#xff1a;Multi-View Stereo Representation Revisit: Region-Aware MVSNet 目录 Abstract1 Introduction2 Related Work3 Method3.1 Cost Volume Construction3.2 Signed Distance Supe…

十一、弹性盒flex - 介绍

目录 1.flex介绍 2.详解 一、flex介绍 flex&#xff08;弹性盒&#xff0c;伸缩盒&#xff09; css中的又一种布局手段&#xff0c;它主要用来代替浮动来完成页面的布局。flex可以使元素具有弹性&#xff0c;让元素可以跟随页面的大小的改变而改变。 我们知道float&#xff1…

【linux kernel】一文总结linux内核通知链

文章目录 1、通知链简介2、通知链的类型3、原理分析和API&#xff08;1&#xff09;注销通知器&#xff08;2&#xff09;注销通知器&#xff08;3&#xff09;通知链的通知 4、实例代码&#xff08;1&#xff09;定义一个通知链&#xff08;2&#xff09;实现观察者模块&#…

从源码全面解析 Java SPI 的来龙去脉

一、引言 对于 Java 开发者而言&#xff0c;关于 dubbo &#xff0c;我们一般当做黑盒来进行使用&#xff0c;不需要去打开这个黑盒。 但随着目前程序员行业的发展&#xff0c;我们有必要打开这个黑盒&#xff0c;去探索其中的奥妙。 虽然现在是互联网寒冬&#xff0c;但乾坤…

数字化转型应该从哪里开始?

数字化转型可能是一个复杂的过程&#xff0c;涉及将数字技术和战略集成到组织的各个方面。虽然具体的起点可能会根据组织的规模、行业和目标而有所不同&#xff0c;但数字化转型计划通常从以下几个共同领域开始&#xff1a; 愿景和战略&#xff1a;转型之旅应从与组织目标一致的…