js阻塞浏览器ui渲染

浏览器渲染过程 在同一台机器,相同网络环境的一个测试: 浏览器产生白屏。是因为UI在渲染过程中被阻塞了。那么问题来了,是什么阻塞了它呢? 渲染过程 i.渲染是以流式进行的。不需要得到全部数据再渲染,如:HTML文件下载多少就渲染多少; ii.大多数HTML外部资源都不会阻塞UI线程,如:CSS、IMG、Flash等,没有load完毕的图片会留一个空位置在那里; iii.大多数的HTML元素都是渲染出DOM便立刻显示的; iiii.HTML从上到下解析,该过程不可逆(参考 i)。但会出现reflow(重排) and rep 阅读详情

js加载与执行阻塞浏览器ui渲染

前言

我们都知道,javascript 脚本应该放置在 html 文档的底部,其实这只是个比较保险的做法,要想javascript 脚本不会阻塞浏览器 ui 的渲染,需要知道以下 javascript 脚本加载与执行对 ui 渲染的影响。

先上结论

下面结论针对外链脚本,在此之前应该明白两个概念,加载 和 执行,加载就是下载到本地,执行就是运行脚本。

  1. 若脚本标签不带 defer 或者 async 属性,则脚本属于同步加载,此时脚本加载会阻塞浏览器解析 html 文档。
  2. 若脚本标签带 defer 或者 async ,则脚本属于异步加载,此时脚本加载不会阻止浏览器解析 html 文档。
  3. 脚本执行都会阻塞浏览器 ui 渲染(dom树构建,css树构建,渲染树构建,重排,重绘)。
  4. 在浏览器中 javascipt 和 ui 渲染公用一个线程,但是下载的时候浏览器会有一个线程池维护一些 io操作(网络IO,磁盘IO),所以下载的时候通过设置可以不阻塞 ui 渲染。

在此说一下, defer 和 async 的相同点在于 都是异步加载脚本,区别在于 async 加载完会立即执行,而 defer 是在 dom 树解析(仅仅是dom结构,不管样式表,图片这些)之后执行。

测试

针对上面的结论,我们挨个测试。

1. 若脚本标签不带 defer 或者 async 属性,则脚本属于同步加载,此时脚本加载会阻塞浏览器解析 html 文档。

看下面代码 html:

<!-- demo.html -->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="http://localhost/study/add.php" ></script>
    <style>
        .box {
            width: 400px;
            height: 400px;
            background: yellow;
        }
    </style>
</head>
<body>
    <div class="box">1ddd2223fff3f1</div>

</body>
</html>

add.php

<?php

sleep(2);

将php 放到网站根目录下,打开 demo.html 即可测试,在此我们看到 add.php 返回的脚本大小很小,但是我们通过 sleep 模拟加载慢的情况,也就是延长加载时间,我们打开浏览器可以看到,经过一段时间后 页面上才渲染出 box 元素。

2. 若脚本标签带 defer 或者 async ,则脚本属于异步加载,此时脚本加载不会阻止浏览器解析 html 文档

看下面代码:

<!-- demo.html -->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="http://localhost/study/add.php"  defer ></script>
    <style>
        .box {
            width: 400px;
            height: 400px;
            background: yellow;
        }
    </style>
</head>
<body>
    <div class="box">1ddd2223fff3f1</div>

</body>
</html>

add.php

<?php

sleep(2);

我们给 script 标签加上 defer 或者 async ,打开浏览器看看,可以看到,box 元素瞬间显示在页面上。

3. 脚本执行都会阻塞浏览器 ui 渲染(dom树构建,css树构建,渲染树构建,重排,重绘)。

看下面代码:html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="demo1.js"></script>
    <style>
        .box {
            width: 400px;
            height: 400px;
            background: yellow;
        }
    </style>
</head>
<body>
    <div class="box">1ddd2223fff3f1</div>

</body>
</html>

demo1.js

let count = 0;
for (let i = 0; i < 1000000000; i ++) {
    count ++;
}

打开浏览器我们发现,浏览器会过一段时间才会显示 box 元素,在这里我们通过大量计算,占用了线程,因为浏览器中 ui渲染和 javascript 公用一个线程,所以会阻塞。

最后

献上一张图(盗的)-.-
在这里插入图片描述

Pytorch实现softmax多分类 PyTorch实现softmax多分类 阅读详情

相关推荐

2021哈工大网安837考研初试经验贴

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

weixin_41797880的博客 6523

js常见问题总结-阻塞渲染

阻塞渲染问题 文章目录阻塞渲染问题1.测试2.head中css是否阻塞DOM渲染?3.body中的css是否阻塞DOM渲染?4.js会阻塞DOM解析和渲染吗?5.css会阻塞js的执行?6.JS 是否会触发页面渲染?7.如何引用script来缓解DOM渲染阻塞?8.一个问题:内联式script标签应该放到body标签之前或者之后是否可行?9.总结 浏览器渲染机制:解析DOM生成DOM Tree,解析CSS生成CSSOM Tree,两者结合生成render tree渲染树,最后浏览器根据渲染树渲染至页面。 1

nahedan的博客 1535

在MCUXpresso上通过J-link烧写KW45

背景: KW45B是nxp 的ble npi产品,其使用的IDE为MCUXpressso或者IAR,MCUXpressso有一些bug,但是由于MCUXpressso阅读查找代码相对IAR容易,所以我经常使用的MCUXpressso进行开发。当然IAR也有其优势,比如编译、烧写速度相对MCUXpressso更快,是比较通用的一个平台,而MCUXpressso是NXP独有的。 Kw45有两种烧写方式,一是使用MCUlink,二是使用Jlink。NXP ble 产品线提供的IDE资料里有最新的15.0版本的

weixin_41889258的博客 2859

Javascript之UI线程与性能优化

    在浏览器中,Javascript执行与UI更新是发生在同一个进程(浏览器UI线程)中的。UI线程的工作基于一个简单的队列系统,任务会被保存到队列中直到进程空闲时被提取出来执行。所以Javascript的执行会阻塞UI更新;反之,UI更新也会阻塞Javascript的执行。给用户的表现就是浏览器在工作时短暂或长时间失去反应,用户的操作不能及时得到响应。而UI线程的阻塞很多时候是由于我们要在代...

JH.L 357

创新实训项目博客:基于LoRA的医疗大模型高效微调实战

预训练大语言模型(LLMs)虽然具备了广泛的知识和一定的通用能力,但在特定领域(如医疗)或特定任务(如遵循特定指令格式进行思考链推理)上,其表现往往不尽如人意。微调(Fine-tuning)能够使模型学习到特定领域的数据分布和任务模式,从而在目标任务上获得更好的性能,使其更贴合实际应用需求。使用Unsloth框架加载并以4-bit量化模型。基于数据集,构建了包含明确思考链引导的训练Prompt。配置了LoRA参数,并使用SFTTrainer在单张T4 GPU上对模型进行了高效微调。

m0_73556916的博客 1290

18650电池组流体直冷热管理仿真:COMSOL多物理场耦合建模路线与实战策略

在动力电池与储能系统的热管理设计中,多物理场耦合仿真已成为平衡性能与成本的关键工具。液冷方案的换热极限促使行业转向制冷剂直冷技术,而两相流与电池产热的强耦合特性,使得基于COMSOL的数值建模成为评估系统温升与流动分配的重要手段。工程实践中,电化学-热-流场全耦合模型与集总电池-流场简化模型各有适用场景,前者揭示电池内部微观机理,后者则以高计算效率支撑包级方案迭代。通过合理简化几何、标定内阻与熵热系数、设置等效换热边界,仿真能够准确预测直冷系统在快充或大倍率放电下的温度均匀性与压降特性,从而指导流道优化与制

weixin_33585822的博客 314

JS以及CSS对页面的阻塞

一、JS阻塞 所有的浏览器在下载JS文件的时候,会阻塞页面上的其他活动,包括其他资源的下载以及页面内容的呈现等等,只有当JS下载、解析、执行完,才会进行后面的 操作。在现代的浏览器中CSS资源和图片p_w_picpath资源是并行下载的,在IE6中默认的并行的加载数目是2个,在IE6以后以及其他的浏览器中的默认的并行加载数目是6个。在浏览器从服务器接收到HTML文档后,并...

weixin_34248118的博客 253

“探索thumbdata4文件的奥秘:编程中的神秘存在“

综上所述,thumbdata4文件在编程中是一个常见的存在,与图库应用程序和图片浏览器密切相关。通过使用适当的库和工具,我们可以读取和处理thumbdata4文件中的缩略图数据,以提供更好的用户体验。我们首先读取8字节的块头,其中包含了下一个缩略图块的大小。你可以根据自己的需求来定义对块数据的处理方式,例如将其保存为图像文件或进行其他的分析操作。thumbdata4文件通常以二进制格式存储,其中包含着设备上浏览过的图片的缩略图。因此,你可能需要根据具体的thumbdata4文件结构进行适当的解析和处理。

JieLun_C的博客 792

无阻塞脚本一延迟的脚本

无阻塞脚本: 在页面加载完成之后才加载js代码。即,window对象的load事件触发后再开始下载脚本 实现这种方式的方法之一:延迟的脚本 对使用 defer属性。 defer属性指明加载的脚本不会修改DOM,因此可以延迟执行。 对应的js文件会在解析到时下载,但是不会执行。直到DOM完全加载完成才会执行。带有defer属性的js文件可以和其他资源并行下载。

代码有点烂 395

雷达参数的设置

采样率又可以叫做采样速率或者,顾名思义就是每秒采集的次数。该值越高,单位时间内对信号的采集越多,采样率的单位可以用Hz或者sps表示(sps是采样率,是每秒采样点的数量,sp表示采样点数),一般1sps=1Hz。采样时间是采样点数和采样周期的乘积得到的结果。假设实际采样率为4560ksps,采样点数为256,那么采样周期为1/4560(ms),那么ADC的采样时间就为256*(1/4560)(ms)=0.056ms=56微秒。

qq_50974341的博客 1912

Open3D 曲率下采样

曲率下采样是一种基于几何特征的点云处理技术,通过计算每个点的曲率来判断其所在位置的局部表面特征,从而进行选择性保留。曲率的计算通常基于点的法向量和其邻域点的分布。

纵马踏花向自由 841

Auto.js UI界面使用 console.show() 阻塞

解决办法: 1、开启悬浮窗权限 2、新建线程开启console ui.layout( <vertical> <button id="btn" text="测试"/> </vertical> ); ui.btn.on("click", ()=>{ toast("我被点啦"); threads.start(function() { console.show(); }); conso

烧烤电影香烟和啤酒 6987

19、情境理论中的信息结构解析

本文系统解析了情境理论中的信息结构,从信息元(infon)的基本概念出发,深入探讨了关系结构与简单信息结构的构建方法,分析了标准信息结构所满足的一系列公理(如A1-A14),并阐述了角色、同一性、高阶信息、循环现象、参数适当性及信息元部分性等核心性质。通过具体示例和流程图展示了信息结构的构建过程,并对比了不同公理下的结构差异,最后讨论了该理论在与其他领域融合中的发展趋势及面临的挑战。

book8的博客 79

浏览器线程有哪些

浏览器中包含什么?三个常驻线程? 浏览器基础结构主要包含七个部分: 用户界面:用户所看到的内容和与之交互的功能组件,比如按钮、表单等等 浏览器引擎:负责控制和管理下一级的渲染引擎 渲染引擎:解析用户请求的内容并返回 网络:负责处理网关相关事宜,比如http服务 UI后端:负责绘制一些提示框等UI组件,底层使用的是操作系统的用户接口 js解析器:负责解析和执行js代码 数据存储:负责存储数据如cookie等 浏览器是多线程的,js是单线程的,浏览器至少包含三个常驻线程: js引擎线程:基于事

gaofan_long的博客 3664

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

浏览器渲染原理及web前端分析

浏览器渲染原理及web前端分析浏览器的主要功能 用户界面:包括地址栏、后退/前进按钮、书签目录等,也就是除了用来显示你所请求页面的主窗口之外的其他部分。 浏览器引擎:用来查询及操作渲染引擎的接口。另外还用来操作浏览器的数据存储。 渲染引擎:用来显示请求的内容,例如,如果请求内容为html,它负责解析html及css,并将解析后的结果显示出来。 网络:用来完成网络调用,例如http请求,它具有平台无关

鱼小鱼的博客 2751

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

前端性能优化-页面性能优化-认识浏览器1

浏览器的主要功能就是向服务器发出请求,在浏览器窗口终止韩式选择的网络资源包括地址栏、前进/后退按钮、书签菜单等。除了浏览器主窗口显示的请求页面外,其他显示的各个部分都属于用户界面在用户界面和渲染引擎之间传送指令。负责显示请求的内容,如果请求的内容是HTML,它就负责解析HTML和CSS内容,并将解析后的内容显示在屏幕上。用于网络调用,比如HTTP请求。其接口与平台无关,并为所有平台提供底层实现。用于绘制基本的窗口小部件,比如组合框和窗口。其公开了与平台无关的通用接口,而在底层使用操作系统的用户界面方法。用于

weixin_42142447的博客 1599

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

js浏览器原理

浏览器组成及绘制其原理

plainj的专栏 295

JavaScript 执行方式与阻塞机制实验报告

效果图:实验原理。

2501_94779981的博客 228

浏览器的运行机制--浏览器的渲染进程

写本博客的原因在于:面试的时候,被问到为什么渲染进程和Js进程是互斥的,虽然知道是互斥的,但是说不出来原因 https://www.jianshu.com/p/05606b0b4eb1

qq_37758122的博客 186

浏览器多线程和js单线程

转载自 浏览器多线程和js单线程开发过程中遇到js线程和ui渲染线程互斥问题。导致ui无法正常更新等问题。这些问题的根源就是因为浏览器的多线程和js的单线程引起的。看本篇博客之前,应该充分理解消息队列,事件循环,同步异步任务等概念。 这些概念以前都知道,也了解多线程的概念。但是当遇到问题的时候,这些东西都被抛到脑后,值得深思。1.知识点补充js单线程js运作在浏览器中,是单线程的,js代码始终在一...

yangxiaoyanger的博客 235

js 延迟处理 时间为0 又被叫做什么

在 JavaScript 中,当延迟处理的时间设为 0 时,这种延迟处理方式也被称为 "分时处理" 或 "空闲处理"。这意味着 JavaScript 会在浏览器空闲的时候执行延迟处理的函数,而不会在代码执行期间阻塞浏览器的 UI 渲染。 ...

weixin_42587866的博客 76

深入理解JavaScript的事件循环(Event Loop)

本文深入解析JavaScript事件循环机制,比较了浏览器和Node环境下的不同实现。浏览器基于HTML5规范,Node基于libuv库,两者在宏任务(macrotask)和微任务(microtask)处理上存在差异

fjlljf00的专栏 2116

浏览器假死,浏览器堵塞,浏览器卡的原因

在Web开发的时候经常会遇到浏览器不响应事件进入假死状态,甚至弹出“脚本运行时间过长“的提示框,如果出现这种情况说明你的脚本已经失控了。 一个浏览器至少存在三个线程:js引擎线程(处理js)、GUI渲染线程(渲染页面)、浏览器事件触发线程(控制交互)。 1:JavaScript引擎是基于事件驱动单线程执行的,JS引擎一直等待着任务队列中任务的到来然后加以处理,浏览器无论再...

万事俱备,就差一个程序员了 3079

JS 如何实现多线程

像setTimeout、ajax的异步请求,或者是dom元素的一些事件,都是在JS主线程执行的,这些操作并没有在浏览器中开辟新的线程去执行,而是当这些异步操作被操作时或者是被触发时才进入事件队列,然后在JS主线程中开始运行。如果说一个脚本语言在执行时,其中某一块的功能在执行时耗费了大量的时间,那么就会造成阻塞。这样的项目,用户体验是非常差的,所以这种现象在项目的开发过程中是不允许存在的。首先说一下浏览器的线程,浏览器中主要的线程包括,UI渲染线程,JS主线程,GUI事件触发线程,http请求线程。

subsistent的博客 957

做一名合格的前端开发工程师(12篇)——第一篇 Javascript加载执行问题探索

从图中可以看出,"hello.js"和“world.js"出现在蓝色线以后,也就说明这两个js是在DomContentLoad结束后再进行触发加载的,这样就不会造成页面的锁定。看上面的“瀑布图”,估计大家也看出来了,三个js文件进行了三次“Get”请求,大家都知道Get请求是需要带http头的,图片1.jpg的下载是在js执行完成后触发的,这也验证了上面所说的情况,阻止了image的加载。追加js,这就是所谓的“无阻塞“,但是其中有一个非常要注意的地方就是我们对js的要求是否有严格的顺序。

GV191rLvq的博客 213

转载:浏览器渲染过程

转载自:http://www.cnblogs.com/inJS/p/4893434.html 最近工作闲下来了,恰巧最近在研究前端性能优化相关的问题。读到很多书籍、以及以前公司分享的一些相关资料。这里将它们总结起来,以便大家学习。我们的目标是:没有白屏,对!没有白屏。 以下是在同一台机器,相同网络环境的一个测试: 大家都知道,浏览器产生白屏。是因为UI在渲染过程中被阻塞了。那么问题来了,...

lengye7的博客 365
上一篇: js 实现 bind call apply
下一篇: Es6遍历器学习总结
I_m_Groot
博客等级 码龄8年 12粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值