Script标签的加载顺序

2023-12-22 22:10:17 287

script标签加载相关的一些属性

属性名称解释
async对于普通脚本,如果存在 async 属性,那么普通脚本会被并行请求,并尽快解析和执行。简单的说,就是异步执行
crossorigin正常的 script 元素将最小的信息传递给 window.onerror,用于那些没有通过标准 CORS 检查的脚本
defer这个布尔属性的设置是为了向浏览器表明,该脚本是要在文档被解析后,但在触发 DOMContentLoaded 事件之前执行的.包含 defer 属性的脚本会按照它们出现在文档中的顺序执行
fetchpriority提供一个指示,说明在获取外部脚本时要使用的相对优先级。允许的值:high/low/autointegrity/nomodule/nonce

结论

  1. 如果实在html内部写的script标签,是边加载边执行的,从上到下
  2. 如果是需要外部引入(一般来说也都是外部引入的),那么就需要下载完成并且解释执行完才会执行后面的Html和js,这就是常说的阻塞原理
  3. 如果外部引入的js体积过大,就会存在页面假死的情形,我们一般通过async和defer去解决
  4. async属性就是异步加载
  5. defer属性就是延迟加载,并严格按照标签引入顺序去执行

这里有两个概念在解释下,加载(下载)和执行(解释);
一般外部的资源,是要通过网络下载的,体积越大,下载用的时间也就越多。
如果我们1.js体积很大,下载耗时3秒;2.js体积很小,下载1ms,而我们2.js的方法会先执行,但是这个方法又依赖1.js里的方法,这时就会报错。
所以我们要保证1.js先执行,这时就需要用defer属性保证执行顺序了。
如果2.js不依赖1.js,而2.js的执行会阻塞页面的渲染,为了更好的体验,我们肯定希望它们是异步执行的,所以可以用async了
这里注意,用document.createElement创建的标签async默认true
script.async = false;

Vue Computed引起的页面卡死

前端出现了个bug当请求接口时, 前端就会卡死, 直接无响应. 控制台看到对应请求的Timing一直卡在Initial connection.将请求单独拿出来放到Postman中请求, 正常响应.通过控制台Network中请求的Initialor进行断点跟踪, 发现前端实际也是获取到了接口的响应.
2024-10-28

Chrome插件 Popup 与 Content-Scripts通信

popup.jsdocument.getElementById("get").addEventListener("click", function () { chrome.tabs.query({ active: true, currentWindow: true }, function (ta
2023-12-22

Script标签的加载顺序

script标签加载相关的一些属性属性名称解释async对于普通脚本,如果存在 async 属性,那么普通脚本会被并行请求,并尽快解析和执行。简单的说,就是异步执行crossorigin正常的 script 元素将最小的信息传递给 window.onerror,用于那些没有通过标准 CORS 检查的
2023-12-22

前端实现tooltip

鼠标悬浮在问号图标上, 下方展示提示文本..tooltip { margin: 8px; padding: 8px; border: 1px solid #CCCCCC; background-color: #F6DBB3; position: absolut
2022-10-31

freemarker 时间显示不正常 设置时区

项目在本地开发的时候显示正常,部署上服务器就一直差8个小时,最后发现freemarker官方文档有这样的说明time_zone:时区的名称来显示并格式化时间。 默认情况下,使用JVM的时区。 也可以是 Java 时区 API 接受的值,或者 "JVM default" (从 FreeMarker 2
2020-03-28
IDEA 2019.1 xml 不高亮

IDEA 2019.1 xml 不高亮

前几天更新了idea后,发现xml里的代码都没有了高亮,变得跟记事本一个德性了打开setting ,搜索 File Types,找到xml项, 查看下方的匹配格式,果然没有xml,(idea真是厉害)点击右方的+,输入*.xml,点击ok,解决问题
2020-03-28

npm install 淘宝镜像

npm install --registry=https://registry.npm.taobao.org
2020-03-28
Java中方法的参数传递机制

Java中方法的参数传递机制

来看一段代码 public class Man { private String name; private Integer age; public String getName() { return name; } publi
2020-03-28
基于自定义注解手写权限控制

基于自定义注解手写权限控制

方法一: AOP 方法二: 拦截器项目结构项目依赖<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-w
2020-03-28

Docker 部署 详细全过程 附代码

Docker 部署本站 全过程环境:CentOS7.61. 安装Docker其他版本CentOS可以参考这个https://help.aliyun.com/document_detail/187598.html查看本机内核版本,内核版本需高于 3.10uname -r 确保 yum 包最新yum u
2020-03-28

SpringBoot 启动普通java工程

引入依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.0.9</version> </dependency>
2020-03-28

Vue.js DOM操作

<template> <input type="button" @click="reply($event)" value="回复"> </template> export default { methods: { replyFun(e) {
2020-03-29
CentOS7编译调试OpenJDK12

CentOS7编译调试OpenJDK12

1. 下载源码https://hg.openjdk.java.net/jdk/jdk12点击左侧的browse,再点击zip,就可以下载zip格式的源码压缩包。unzip xxx.zip 解压文件2. 安装jdkyum install java-11-openjdk-devel -y3. 运行con
2020-04-23
编写自己的Spring Boot Starter

编写自己的Spring Boot Starter

1.新建一个maven项目命名规则统一是xxx-spring-boot-starter完整pom.xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"
2020-06-29