了解html页面的渲染过程以备学习前端的性能优化

本文主要是介绍了解html页面的渲染过程以备学习前端的性能优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

昨天晚上写了一篇关于浏览器的渲染过程的随笔,但只是通过一小段代码解释了一下,并没有通过浏览器测试,说服力不够,而且还有很多不完善的地方,今天在浏览器中测试了一下,并把测试的结果分享给大家,测试过程可能有点乱,希望大家理解。

测试浏览器:Chrome v24.0.1312.52 m,Firefox v18.0,Opera v12.12。

在WebKit内核中,网页在显示的时候会有一个解析器(Parser)去解析html文档,然后去生成渲染树(Render Tree),最终渲染出页面。这是在一个线程中进行的,所以两者不会同时进行。

我分为了以下两种情况,并分别在不同的浏览器中进行测试。

样式文件在head里,其他的连个脚本文件一个在body的开始部分,一个在body的底部。样式文件在body的开始部分,脚本文件的位置和上面的一样。

测试的结果是这样的,在chrome中,样式文件的位置会影响到图片的下载时间,而在另外两个浏览器中这两种情况没有区别。下面是详细的测试过程。

测试一:样式文件在head里,其他的连个脚本文件一个在body的开始部分,一个在body的底部。

测试的代码:

复制代码
代码如下:

<!doctype html>
<html>
<head>
<title>测试页面</title>
<link rel="stylesheet" type="text/css" href="example.aspx?sleep=3" />
</head>
<body>
<div>
Hi, there!</div>

<script type="text/javascript">
document.write("<script src='other.aspx?sleep=5'></scr" + "ipt>");
</script>

<div>
Hi, again!</div>
<img src="images/marx.jpg" alt="Marx" />
<img src="images/engels.jpg" alt="Engels" />
<img src="images/Lenin.jpg" alt="Lenin" />

<script src="last.aspx" type="text/javascript"></script>

</body>
</html>

1、在Chrome中的测试情况

我在浏览器中打开页面后,迅速将网页截了一张图,如下所示(点击可以查看大图,下同):

从上图中可以看出,test.htm 文档已经加载完成,页面上还没有显示任何东西,example.css处于pending状态,但是,位于最底部的last.js却加载完成了。这说明chrome进行了预加载,提前下载,放在了浏览器的缓存里了。虽然last.js已经加载完成,但是还没有被执行,因为他前面的样式文件会阻塞脚本的执行。

接下来,当example.css加载完成后,Hi there!显示在了屏幕上,浏览器的截图如下所示

通过网络请求可以看出,example.css已经加载完成,other.js处于pending状态,但此时script标签底下的三张图片已经下载下来了,这是由浏览器的预先加载的功能所致。但是由于浏览器的渲染被other.js脚本阻塞住,所以,这三张图片连同它上面的“Hi again”都不会显示出来。另外,此时last.js中的代码还没有执行。

接下来,当other.js加载完成之后,浏览器就会构建出渲染树,显示出“Hi again”,并显示出图片。由于last.js先前已经被下载,所以last.js会立即执行。整个渲染过程完成。如下图所示:

 

由此看出,Chrome会预先加载body中的脚本资源(样式文件没有测试),由JavaScript脚本动态加载的JS不会影响图片文件的下载,但是会影响它下面图片的渲染。

 

2、Firefox中的测试结果

    在Firefox浏览中打开页面后迅速截图,如下所示:

和在Chrome中有很明显的不同,"Hi there!",已经显示在了页面上,但是背景色是白色,说明此时样式文件还没有下载下来。而在Chrome中是不会显示的,要等到样式文件加载完成。

接下来,当整个页面加载完成之后,截图如下所示:

从请求的瀑布流中可以看出,和Chrome类似,浏览器对last.js进行了预加载,和Chrome中不同的是,火狐没有对图片进行预加载,而是等到other.js加载完成之后再进行的加载。

火狐中,样式文件并没有影响文档的渲染(最典型的现象就是,网页一开始显示的很乱,没有样式,当样式文件下载下来之后就显示正常了),在body中,由JavaScript动态加载的JS文件会阻塞它后面的图片的下载。

3、在Opera浏览器中

经过在Opera中测试,发现Opera浏览器比较“守规矩”,所有的资源都是按顺序加载的,并没有出现所谓的预先加载,下面是一张总的效果图:

Opera中,样式文件会阻塞页面的渲染,这和Chrome类似,但是,有Opera的请求瀑布流可以看出,页面中的所有的资源都是按部就班的加载的,other.js提前于last.js加载。没有预加载。

测试二、样式文件在body的开始部分,脚本文件的位置和测试一的一样。

  
复制代码
代码如下:
<!doctype html><html><head><title>测试页面</title></head><body><link rel="stylesheet" type="text/css" href="example.aspx?sleep=3" /><div>Hi, there!</div><script type="text/javascript">document.write("<script src='other.aspx?sleep=5'></scr" + "ipt>");</script><div>Hi, again!</div><img src="images/marx.jpg" alt="Marx" /><img src="images/engels.jpg" alt="Engels" /><img src="images/Lenin.jpg" alt="Lenin" /><script src="last.aspx" type="text/javascript"></script></body></html>
经过测试,发现在火狐和Opera中,结果和测试一的一样,而在Chrome中稍微有些不同,在测试一中,图片要等到head中样式文件加载完之后才会下载,但是测试二中会和样式文件并行下载,如下图:

总结

预加载确实是存在的,但是在Opera中没有发现;Chrome的图片可以和body中的样式文件并行下载,但是不能和head中样式文件并行下载。脚本的执行要在它前面的样式文件加载完之后。Chrome和Opera中,未加载完的资源会阻塞它后面元素的渲染,而火狐不会。测试结果可能和浏览器版本有关。

看完这些,大家是不是觉得有些乱了,我想尽可能的表达明白,但是限于我水平有限,只能做到这了,不妥之处希望大家指出,大家也可以亲自做一下试验看看。

这篇关于了解html页面的渲染过程以备学习前端的性能优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/462190

相关文章

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存