10分钟看懂浏览器的渲染过程及优化

一、浏览器概述

  目前的主流浏览器有5个:Internet Explorer、Firefox、Safari、Chrome和Opera浏览器。根据 StatCounter 浏览器统计数据,目前(截止2019 年 5 月)Firefox、Safari 和 Chrome 浏览器的总市场占有率将近 83.66%。由此可见,如今开放源代码浏览器在浏览器市场中占据了非常坚实的部分。
  以上5种浏览器由于有着不同的浏览器内核,造成同样的html页面有着不同呈现。Internet Explorer的内核是Trident;Firefox的内核是Gecko;Chrome、Safari内核是Webkit;Opera的内核则是Presto。

二、浏览器渲染过程

  我们先大致看下浏览器渲染关键路径图:

1、HTML解析,构建DOM树

  浏览器从网络或硬盘中获得HTML字节数据后会经过以下流程将字节解析为DOM树

  • 字符编码:先将HTML的原始字节数据转换为文件指定编码的字符。
  • 令牌化:然后浏览器会根据HTML规范来将字符串转换成各种令牌(如<html><body><p>这样的标签以及标签中的字符串和属性等都会被转化为令牌,每个令牌具有特殊含义和规则)。
  • 生成节点对象:接着每个令牌都会被转换成定义其属性和规则的对象,即节点对象。
  • 构建DOM树:最后将节点对象构建成树形结构,即DOM树。HTML标签之间有复杂的父子关系,树形结构刚好可以诠释这样的关系。

  下面通过一段HTML代码与配图更好的理解“字节 -> 字符 -> 令牌-> 节点对象 -> 对象模型”这个过程:

<html><head><meta name="viewport" content="width=device-width,initial-scale=1"><link href="style.css" rel="stylesheet"><title>Critical Path</title></head><body><p>Hello <span>web performance</span> students!</p><div><img src="test.png"></div></body>
</html>
复制代码

DOM树构建过程

2、CSS解析,构建CSSOM树

  浏览器解析遇到<link>标签时,浏览器就开始解析CSS,像构建DOM树一样构建CSSOM树。style.css的代码如下:

body { font-size: 16px }
p { font-weight: bold }
span { color: red }
p span { display: none }
img { float: right }
复制代码

CSSOM树

3、Render Tree

  在构建了DOM树CSSOM树之后,浏览器只是拥有2个相互独立的对象集合,DOM树描述的文档结构和内容,CSSOM树描述了对应文档的样式规则,想要渲染出页面,就需要将DOM树CSSOM树结合在一起,构建渲染树。

渲染树

4、Layout

  渲染树构建好后,浏览器得到了每个节点的内容与样式,下一步就是需要计算每个节点在浏览器窗口的确切位置与大小,即layout布局。
  布局阶段,从渲染树的根节点开始遍历,采用盒子模型的模式来表示每个节点与其他元素之间的距离,从而确定每个元素在屏幕内的位置与大小。

盒子模型:包括外边距(margin),内边距(padding),边框(border),内容(content)。标准盒子模型width/height = content;IE盒子模型width/height = content + padding + border。

盒子模型

5、Paint绘制页面

  当Layout布局完成后,浏览器会立即发出Paint事件,开始讲渲染树绘制成像素,绘制所需要的时间跟CSS样式的复杂度成正比,绘制完成后,用户才能看到页面在屏幕中的最终呈现效果。

  如果想更详细地体验浏览器渲染流程,可以使用Chrome开发者工具中的Performance面板,录制浏览器从请求直到渲染完成的过程,如下图所示:

Performance

三、渲染优化方案

1、优化渲染关键路径方案

  通过优化渲染关键路径,可以优化页面渲染性能,减少页面白屏时间。

  • 优化JSJavaScript文件加载会阻塞DOM树的构建,可以给<script>标签添加异步属性async,这样浏览器的HTML解析就不会被js文件阻塞。
  • 优化CSS:浏览器每次遇到<link>标签时,浏览器就需要向服务器发出请求获得CSS文件,然后才继续构建DOM树CSSOM树,可以合并所有CSS成一个文件,减少HTTP请求,减少关键资源往返加载的时间,优化渲染速度。

2、其他优化方案

  • 加载部分HTML
    浏览器先加载主要HTML初始化静态部分,动态变化的HTML内容通过Ajax请求加载。这样可以减少浏览器构建DOM树的工作量,让用户感觉页面加载速度很快。
  • 压缩
    对HTML、CSS、JavaScript这些文件去除冗余字符(例如不必要的注释、空格符和换行符等),再进行压缩,减小文件数据大小,加快浏览器解析文件编码。
  • 图片加载优化
    1)小图标合并成雪碧图,进而减少img的HTTP请求次数;
    2)图片加载较多时,采用懒加载的方案,用户滚动页面可视区时再加载渲染图片。
  • HTTP缓存
    浏览器自带了HTTP缓存的功能,只需要确保每个服务器响应的头部都包含了以下的属性:
    1)ETag: ETag是一个传递验证令牌,它对资源的更新进行检查,如果资源未发生变化时不会传送任何数据。当浏览器发送一个请求时,会把ETag一起发送到服务器,服务器会根据当前资源核对令牌(ETag通常是对内容进行Hash后得出的一个指纹),如果资源未发生变化,服务器将返回304 Not Modified响应,这时浏览器不必再次下载资源,而是继续复用缓存。
    2)Cache-Control: Cache-Control定义了缓存的策略,它规定在什么条件下可以缓存响应以及可以缓存多久。
    a、no-cache: no-cache表示必须先与服务器确认返回的响应是否发生了变化,然后才能使用该响应来满足后续对同一网址的请求(每次都会根据ETag对服务器发送请求来确认变化,如果未发生变化,浏览器不会下载资源)。no-store直接禁止浏览器以及所有中间缓存存储任何版本的返回响应。简单的说,该策略会禁止任何缓存,每次发送请求时,都会完整地下载服务器的响应。
    b、public&private: 如果响应被标记为public,则即使它有关联的HTTP身份验证,甚至响应状态代码通常无法缓存,浏览器也可以缓存响应。如果响应被标记为private,那么这个响应通常只为单个用户缓存,因此不允许任何中间缓存(CDN)对其进行缓存,private一般用在缓存用户私人信息页面。
    c、max-age: max-age定义了从请求时间开始,缓存的最长时间,单位为秒。

小结

  今天浏览器渲染过程和优化方案就介绍到这里,大家如果有更多更好的页面性能优化方案可以多多交流,评论区欢迎留言~~

转载于:https://juejin.im/post/5d136700f265da1b7c6128db

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

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

相关文章

浅谈 Vue 项目优化

前几天看到大家说 vue 项目越大越难优化&#xff0c;带来很多痛苦&#xff0c;这是避免不了的&#xff0c;问题终究要解决&#xff0c;框架的性能是没有问题的&#xff0c;各大测试网站都有相关数据。下面进入正题 基础优化 所谓的基础优化是任何 web 项目都要做的&#xff0c;…

uni-app微信小程序一键登录获取权限功能

<button class"bottom size_30" type"primary" lang"zh_CN" click"getUserInfo">一键登录</button>//第一授权获取用户信息》按钮触发getUserInfo() {// 展示加载框uni.showLoading({title: 加载中,});uni.getUserProfile…

第九章 结构体与共用体

姓名&#xff1a;吕家浩 实验地点&#xff1a;教学楼514教室 实验时间&#xff1a;4月30日 一、本章要点 1.通过实验理解结构体和共用体的数据结构2.结构体、共用体中数组的使用及变量的赋值3.结构体和共用体定义时的嵌套使用&#xff08;嵌套使用的结构体必须先定义&…

H5-localStorage数据存储总结

一、什么是localStorage、sessionStorage 在HTML5中&#xff0c;新加入了一个localStorage特性&#xff0c;这个特性主要是用来作为本地存储来使用的&#xff0c;解决了cookie存储空间不足的问题(cookie中每条cookie的存储空间为4k)&#xff0c;localStorage中一般浏览器支持的…

正则校验与时间格式化

// 日期回显 export function formatTime(data&#xff0c;fametYYYY-MM-DD HH:MMM:SS) {if(famet YYYY-MM-DD HH:MMM:SS){const time new Date(data)const year time.getFullYear()const month time.getMonth() 1const day time.getDate()const hour time.getHours()co…

CometOJ#6 双倍快乐(简单DP)

链接&#xff1a;https://www.cometoj.com/contest/48/problem/B 题意&#xff1a;给出一串数列&#xff0c;要求在这个数列中找出两条“不相交”的非下降子序列使得子序列之和最大。“不相交”即不存在任意的ai同时存在于两个子序列中。 分析&#xff1a;笔者刷题量不多&#…

iOS开发-证书问题精析~

在iOS开发过程中&#xff0c;不可避免的要和证书打交道&#xff0c;真机调试、App上架、打包给测试去测试等都需要搞证书。在此过程中我们会遇到很多的问题&#xff0c;但是如果掌握了真机调试的原理和本质&#xff1b;遇到问题&#xff0c;我们就更容易定位问题之所在&#xf…

selenium+Java自动化

转载于:https://www.cnblogs.com/arvin-feng/p/11110483.html

html 5 本地数据库(Web Sql Database)

基于HTML5的Web DataBase 可以让你在浏览器中进行数据持久地存储管理和有效查询&#xff0c;假设你的离线应用程序有需要规范化的存储功能 本文讲述如何使用核心方法openDatabase、transaction、executeSql 1.新建一个网页&#xff0c;比如&#xff1a;test.html 内容如下&am…

前端学习资料及路线名称网站

IT前端学习资料及路线常用PC端UI组件库饿了么(Element-UI)https://element.eleme.cn/#/zh-CN常用小程序端UI组件库uView UIhttp://v1.uviewui.com/名称网站JQuery文件网https://code.jquery.com/jquery/jQuery手册&#xff08;pc端&#xff09;http://jquery.cuishifeng.cn/jQu…

JS实现生成一个周对应日期数组

/* 获取日期和周 */getDateWeek() {/* 得到当前日期的时间戳 */const timestamp Date.now()// const timestamp new Date(2019, 7, 30, 0, 0, 0, 0).getTime()const dateWeek Array.from(new Array(7)).map((_, i) > {/* 得到当前周每一天的时间戳 */const weekTimestamp…

npm升级package.json依赖包

使用npm管理node的包&#xff0c;可以使用npm update <name>对单个包升级&#xff0c;对于npm的版本大于 2.6.1,可以使用命令: npm install -g 升级全局的本地包。 对于版本小于2.6.1的一个一个包的升级实在是太麻烦&#xff0c;就想找到一个升级所有本地包的方法&#x…

Sublime Text 3 快捷键汇总

Sublime Text 3非常实用&#xff0c;但是想要用好&#xff0c;老是忘记&#xff0c;汇总一下&#xff0c;方便自己方便别人。 用惯了vim&#xff0c;有些快捷键也懒得用了&#xff0c;尤其是在win下面&#xff0c;还有图形界面&#xff0c;所以个人觉得最有用的还是搜索类&…

Minimal coverage (贪心,最小覆盖)

题目大意&#xff1a;先确定一个M&#xff0c; 然后输入多组线段的左端和右端的端点坐标&#xff0c;然后让你求出来在所给的线段中能够 把[0, M] 区域完全覆盖完的最少需要的线段数&#xff0c;并输出这些线段的左右端点坐标。 思路分析&#xff1a; 线段区间的起点是0&#x…

vuex知识点

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式&#xff1b;集中存储和管理应用的所有组件状态。 状态&#xff1a;什么是状态&#xff0c;我们可以通俗的理解为数据。Vue只关心视图层&#xff0c;那么视图的状态如何来确定&#xff1f;我们知道是通过数据驱动&#xff0c…

Kafka2.0生产者客户端使用

1 初始化配置 Kafka 通过 KafkaProducer 构造器初始化生产者客户端的配置。   常用的重要配置&#xff0c;详见官网。 bootstrap.servers&#xff1a;Kafka 集群地址&#xff08;host1:post,host2:post&#xff09;&#xff0c;Kafka 客户端初始化时会自动发现地址&#xff0…

vuex小例

少废话&#xff0c;先出东西 vuex main.js import Vue from vue import App from ./App import router from ./router import store from ./store Vue.config.productionTip falsenew Vue({el: #app,router,store,render: xx>xx(App) })store.js 平级目录未建文件夹import…

[论文笔记]CVPR2017_Joint Detection and Identification Feature Learning for Person Search

Title: Joint Detection and Identification Feature Learning for Person Search; aXiv上该论文的第一个版本题目是 End-to-End Deep Learning for Person SearchAuthors: Tong Xiao1* ; Shuang Li1* ; Bochao Wang2 ; Liang Lin2; Xiaogang Wang1 Affilations: 1.The Chines…

php下的原生ajax请求

浏览器中为我们提供了一个JS对象XMLHttpRequet&#xff0c;它可以帮助我们发送HTTP请求&#xff0c;并接受服务端的响应。 意味着我们的浏览器不提交&#xff0c;通过JS就可以请求服务器。ajax(Asynchronous Javascript And XML)其实就是通过XHR对象&#xff0c;执行HTTP请求。…

HBase性能优化总结

HBase性能优化方法总结&#xff08;一&#xff09;&#xff1a;表的设计 1. 表的设计 1.1 Pre-Creating Regions 默认情况下&#xff0c;在创建HBase表的时候会自动创建一个region分区&#xff0c;当导入数据的时候&#xff0c;所有的HBase客户端都向这一个region写数据&#x…