网站性能优化—CRP

news/2024/5/6 16:52:17/文章来源:https://blog.csdn.net/weixin_34184158/article/details/89078379

为了把HTML、CSS和JavaScript转化成活灵活现、绚丽多彩的网页,浏览器需要处理一系列的中间过程,优化性能其实就是了解这个过程中发生了什么-即CRP(Critical Rendering Path,关键渲染路径)。首先,我们从头开始快速学习一下浏览器是如何显示一个简单网页的。

浏览器渲染一个网页的过程

构建对象模型

文档对象模型(DOM)

<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="awesome-photo.jpg"></div></body>
</html>

一个普通的页面,里面包含一些文本和一张图片,浏览器是如何处理这个页面的呢?
clipboard.png

  1. 转换:浏览器从磁盘或网络读取HTML的原始字节,然后根据指定的文件编码格式(例如 UTF-8)将其转换为相应字符

  2. 令牌化:浏览器把字符转化成W3C HTML5 标准指定的各种确切的令牌,比如"<html>"、"<body>"以及其他在尖括号内的字符串。每个令牌都有特殊的含义以及它自己的一套规则

  3. 词法分析:生成的令牌转化为对象,这个对象定义了它们的属性及规则

  4. DOM构建:最后,由于HTML标记定义了不同标签之间的关系(某些标签嵌套在其他标签中),创建的对象在树状的数据结构中互相链接,树状数据结构也捕获了原始标签定义的父子关系:HTML对象是body对象的父对象,bodyp对象的父对象等等
    clipboard.png

上述整个流程的最终输出是文档对象模型,即这个简单网页的 "DOM",浏览器完成页面的所有后续处理都是建立在这个DOM基础上的。
打开Chrome DevTools > Timeline,录制时间轴,上述过程对应Loading事件中的Parse HTML事件,可以查看到执行这一过程所需要的时间。
DOM树捕获了文档标记的属性及关系,但它没有告诉我们元素在渲染时是什么样子的。这是CSSOM要干的活,也就是接下来要讲的。

CSS对象模型(CSSOM)

当浏览器构建上述网页DOM的时候,在head里面碰到一个link标签,这个标签引用了一个外部的CSS样式表:style.css。浏览器预测会需要这个资源来渲染页面,因此会立即发出一个该资源的请求,该请求返回以下内容:

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

与HTML一样,我们需要将收到的 CSS 规则转换为浏览器可以理解、能够处理的东西。因此,我们重复与处理 HTML 非常相似的过程:
clipboard.png

最终输出的是CSS对象模型,即CSSOM。
clipboard.png

想要查看CSS处理过程所花费的时间,可以在录制的时间轴中查看Rendering事件中的Recalculate Style事件:与DOM解析不同,timeline不显示单独的“Parse CSS”条目,而是在Recalculate Style事件下一同捕获CSS解析CSSOM构建以及computed styles的递归计算

构建渲染树、布局及绘制

前面介绍了我们根据输入的HTML及CSS构建了DOM树和CSSOM树,但二者是独立的对象:DOM描述的是文档内容,CSSOM描述的是应用于文档的样式规则。浏览器会把DOM和CSSOM组合起来构建一个渲染树(Render-tree),渲染树会捕获页面上所有可见的DOM内容以及应用在每个节点上的CSSOM样式。

clipboard.png

构建渲染树的过程大致如下:

  1. 从DOM树的根节点开始,遍历每个可见的节点

    • 某些节点不可见(例如 script 标签、meta 标签等),因为它们不会体现在渲染结果中,所以会被忽略

    • 某些通过 CSS 隐藏的节点在渲染树中也会被忽略,比如应用了 display:none 规则的节点

  2. 为每一个可见的节点匹配并应用对应的CSSOM规则

  3. 生成有内容计算样式的可见节点

小提示:注意visibility: hiddendisplay: none二者的区别。visibility: hidden只是让元素在视觉上不可见,但是元素在页面布局中仍然占据空间。而display: none则是从渲染树中删除某一个元素,不仅视觉上不可见,渲染树上也没有,更不会影响到页面的布局。

最终输出的就是一个包含了所有可见节点的内容及样式信息的渲染树。

到目前为止,我们已经计算出了哪些节点是可见的以及它们的计算样式,但是我们还没有计算它们在设备视口(viewport)中的准确位置及尺寸大小——这就是布局(Layout)阶段要做的工作,也就是常说的重排(reflow)

为了计算出页面中每个对象的准确大小和位置,浏览器从渲染树的根节点开始遍历,计算页面上每个对象的几何信息。举例如下:

<html><head><meta name="viewport" content="width=device-width,initial-scale=1"><title>Critial Path: Hello world!</title></head><body><div style="width: 50%"><div style="width: 50%">Hello world!</div></div></body>
</html>

上面页面的 body 包含两个嵌套 div:第一个 div(父元素)将节点尺寸大小设置为视口宽度的 50%,第二个 div 的宽度为父元素的 50%,即视口宽度的 25%!
clipboard.png

布局过程的输出是一个“盒子模型”,它精确地捕获了每个元素在视口中的准确位置及尺寸大小:所有相对度量单位都被转换为屏幕上的绝对像素。

自此,我们已经知道了哪些节点是可见的以及它们的计算样式和几何信息,然后我们就可以把这些信息传送到最后一个阶段,即把渲染树中的每一个节点都转化到屏幕上实际的像素点。这个步骤通常被称为绘制(painting)或者栅格化(rasterizing)

构建渲染树、布局与绘制所消耗的时间也可以通过timeline来查看:

clipboard.png

  • "Layout" 事件捕获渲染树的构建及位置、尺寸的计算

  • 布局完成时,浏览器会触发 'Paint' 事件:将渲染树转化为屏幕上的实际像素

终于,我们的页面在设备视口中可见了。
clipboard.png

现在回顾一下浏览器执行的几个步骤:

  • 处理 HTML 标记,构建 DOM 树

  • 处理 CSS 标记,构建 CSSOM 树

  • 将 DOM 树和 CSSOM 树融合成渲染树

  • 根据渲染树进行布局,计算每个节点的几何信息

  • 在屏幕上绘制各个节点

优化关键渲染路径即尽可能地缩短上述第 1 步到第 5 步耗费的总时间。

优化CRP

阻塞渲染的CSS

在构建渲染树部分我们已了解到:CRP要求DOM和CSSOM两者融合在一起才能构建渲染树。这就导致了一个性能问题:HTML和CSS都是阻塞渲染的资源。HTML很显然,没有DOM就没有内容去渲染。CSS没有那么明显,但确实是阻塞渲染的资源。我们知道一个正常的网页如果没有引入专用的css,页面有多丑陋。当我们的网页引入了专用的css,页面一加载出来的时候就是绚丽多彩的,如果css不阻塞渲染,我们看到的很可能是这样的一个画面:页面刚加载出来的时候其丑无比,过了一会,页面又变漂亮了……

既然CSS是阻塞渲染的资源,这就意味着在CSSOM构建完成之前,浏览器不会去渲染任何已处理的内容。要尽早、尽快地把CSS下载到客户端以优化首次渲染的时间

使用CSS“媒体类型”和“媒体查询”优化阻塞渲染的CSS:

<link href="style.css" rel="stylesheet">
<link href="print.css" rel="stylesheet" media="print">
<link href="other.css" rel="stylesheet" media="(min-width: 40em)">
  • 第一条声明阻塞渲染,匹配所有情况

  • 第二条声明只适用于打印(媒体类型),因此,页面在浏览器中首次加载时,不会阻塞渲染

  • 第三条声明提供了媒体查询,由浏览器判断:如果条件符合,则在该样式表下载并处理完以前,浏览器会阻塞渲染

小提示:「阻塞渲染」仅是指该资源是否会阻塞浏览器的首次页面渲染。无论 CSS 是否阻塞渲染,CSS 资源都会被下载,只是说非阻塞性资源的优先级比较低而已。

阻塞解析的JavaScript

JS可以修改页面的内容、样式以及响应用户的交互,JS在DOMCSSOMJS执行之间引入了很多新的依赖关系,导致浏览器在处理和渲染页面上出现大幅延迟:

  • 当浏览器遇到<script>标签时,DOM构建会暂停,直到脚本执行完毕

  • JavaScript 执行会暂停,直到CSSOM准备就绪

解析器阻塞 vs. 异步 JavaScript

默认情况下,JavaScript 执行会阻塞解析器:当浏览器在文档中遇到<script>标签时,DOM构建必须暂停,浏览器把控制权移交给JS引擎,JS引擎编译并执行脚本,脚本执行完毕后再继续构建DOM。

事实上,内联脚本始终会阻塞解析器,除非你编写额外的代码来延迟它们的执行。那通过<script>引入的外联脚本呢?结果是一样的,浏览器都会暂停,然后执行脚本,脚本执行完毕之后再去处理文档的剩余部分。尽管如此,通过<script>引入外联脚本还是有一个很大的好处。

默认情况下,所有 JS 均会阻塞解析器,因为浏览器不知道脚本想在页面上做什么,因此它必须假定最糟的情况并阻塞解析器。但是,如果我们能够有个信号告知浏览器,说脚本无需在文档中引用它的确切位置被执行呢?这样一来,浏览器就会继续构建DOM,并在脚本准备就绪后执行脚本。

这个信号就是async——在script标签里面添加async关键字,其有两个特性:

  • 告诉浏览器当它碰到<script>标签时不用阻塞DOM构建,因此浏览器会忽略脚本请求,继续解析DOM

  • JS执行不依赖CSSOM:如果在CSSOM就绪之前脚本已经就绪,脚本可以立即执行

很显然,这将会显著提升性能!

小提示:另一个信号是defer,关于两者的区别可以参考一下这个问题的答案defer和async的区别

分析CRP性能

先定义三个用于描述CRP的词汇:

  • 关键资源:能够阻止网页首次渲染的资源

  • 关键路径长度:往返过程的数量,或者获取所有关键资源所需的总时间

  • 关键字节:网页首次渲染所需的总字节数,是所有关键资源的传输文件大小总和。

demo1:

<html><head><meta name="viewport" content="width=device-width,initial-scale=1"><title>Critical Path: No Style</title></head><body><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div></body>
</html>

最简单的可用网页仅由 HTML 标记组成:无 CSS、JavaScript 或其他类型的资源。要呈现此网页,浏览器必须初始化请求、等待 HTML 文档准备就绪、对其进行解析、构建 DOM,最后使其呈现在屏幕上。
clipboard.png

  • 1个关键资源

  • 1个关键路径长度(假设文件很小)

  • 5KB关键字节

T0 和 T1 之间的时间用于捕获网络传输和服务器处理时间。 在最理想的情况(HTML 文件较小)下,我们仅需一个网络往返过程即可提取整个文档(由于 TCP 传输协议的工作方式,较大的文件可能需要多个往返过程)。

demo2:

<html><head><meta name="viewport" content="width=device-width,initial-scale=1"><link href="style.css" rel="stylesheet"></head><body><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div></body>
</html>

clipboard.png

  • 2个关键资源

  • 2个或更多个关键路径长度

  • 9KB关键字节

我们必须同时使用 HTML 和 CSS 来构建渲染树,因此 HTML 和 CSS 均为关键资源;浏览器需要一个网络往返过程来提取 HTML 文档,然后检索到的标记告知我们还需要 CSS 文件,这意味着,浏览器必须返回服务器并获取 CSS,然后才能在屏幕上呈现网页,因此,该网页最少需要两个往返过程才能显示(CSS 文件可能需要多个往返过程,重点在'最少');两种资源加起来的关键字节总量最多为 9 KB。

demo3:

<html><head><meta name="viewport" content="width=device-width,initial-scale=1"><link href="style.css" rel="stylesheet"></head><body><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div><script src="app.js"></script></body>
</html>

clipboard.png

  • 3个关键资源

  • 2个或更多个关键路径长度

  • 11KB关键字节

我们有三个关键资源,关键字节总量最多为 11 KB,但是关键路径长度仍然是两个往返过程,因为我们可以并行传输 CSS 和 JavaScript!

demo4:
如果app.js中的内容不涉及到操作DOM和CSSOM,只是一些分析类型的代码和其他不需要阻塞页面渲染的代码,则可以在<script>中加入“async”属性:

<html><head><meta name="viewport" content="width=device-width,initial-scale=1"><link href="style.css" rel="stylesheet"></head><body><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div><script src="app.js" async></script></body>
</html>

clipboard.png

异步执行脚本有以下几项优势:

  • 脚本再也不会阻止解析器,所以也不再是CRP的组成部分

  • 因为没有其他关键脚本,CSS 也不需要阻止DomContentLoaded事件

  • DomContentLoaded事件触发得越早,其他应用逻辑执行的时间就越早

因此,经过优化的网页恢复到了具有两个关键资源(HTML 和 CSS)、具有两个往返过程的最短关键路径长度和 9 KB 的关键字节总量。

demo5:

如果CSS样式表仅适用于打印:

<html><head><meta name="viewport" content="width=device-width,initial-scale=1"><link href="style.css" rel="stylesheet" media="print"></head><body><p>Hello <span>web performance</span> students!</p><div><img src="awesome-photo.jpg"></div><script src="app.js" async></script></body>
</html>

clipboard.png

因为 style.css 资源仅用于打印,所以只要DOM构建完成,浏览器就具有了渲染网页的足够信息! 所以,该网页仅具有一个关键资源(HTML),最小关键呈现路径长度为一个往返过程和5KB的关键字节。

优化CRP

常规步骤:

  1. 分析、描述关键路径:关键资源数量、字节数、关键路径长度

  2. 最小化关键资源数量:删除相应资源、延迟下载、标记为异步资源等

  3. 减少关键字节数,以减少资源下载时间(往返次数)

  4. 优化剩余关键资源的加载顺序:尽可能早的下载所有关键资源,以缩短关键路径长度


References

  • https://developers.google.com...

  • https://cn.udacity.com/course...

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

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

相关文章

云服务器 ECS 建站教程:SVN的搭建和使用

SVN的搭建和使用简介 Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据。 这些数据放置在一个中央资料档案库(repository) 中。 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本…

大型网站的 HTTPS 实践(一): HTTPS 协议和原理

大型网站的 HTTPS 实践&#xff08;一&#xff09;&#xff1a; HTTPS 协议和原理 1 前言 百度已经于近日上线了全站 HTTPS 的安全搜索&#xff0c;默认会将 HTTP 请求跳转成 HTTPS。本文重点介绍 HTTPS 协议, 并简单介绍部署全站 HTTPS 的意义。 2 HTTPS 协议概述 HTTPS 可以认…

自适应网站设计对百度友好的关键:添加applicable-device标签(转)

现在很多网站都使用了自适应网页设计&#xff08;Response-Web-Design&#xff09;&#xff0c;以满足庞大的移动端用户群的需要。但是在技术上设计了自适应的网页之后&#xff0c;出于SEO的考虑&#xff0c;你还要照顾到如何对百度更友好&#xff0c;即告诉百度“我是自适应页…

Ubuntu 网站服务器环境搭建

如果想用Ubuntu作为网站的服务器&#xff0c;一些基本的服务是必备的。本文对环境的搭建做一个简单的整理。 Appach Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上&#xff0c;由于其跨平台和安全性被广泛使用&#xff0c;是最流行的W…

一个非常不错的背景纹理图的网站

今天闲逛的时候发现的&#xff1a;http://subtlepatterns.com/。里面的纹理图质量都非常高&#xff0c;并且预览也非常方便&#xff0c;无需注册即可下载&#xff0c;这里强烈推荐下。

好书分享:《SEO实战密码》第3版

影响了整整一代SEOer的《SEO实战密码&#xff1a;60天网站流量提高20倍》出第3版了&#xff0c;相信这本书定能再续辉煌&#xff0c;为当下SEO圈传递更有价值的内容、更多正能量&#xff0c;指导更多企业、站长做好网站与推广&#xff0c;此书值得收藏。非常意外&#xff0c;也…

在LAMP环境下搭建Discuz论坛网站

作为一名Linux菜鸟学员&#xff0c;我在搭建好LAMP环境后&#xff0c;闲来无聊&#xff0c;尝试建站&#xff0c;因此选择Discuz论坛站点。在搭建站点时&#xff0c;首先下载Discuz套件&#xff0c;1.wgethttp://download.comsenz.com/DiscuzX/3.1/Discuz_X3.1_TC_UTF8.zip2.un…

本地运行ASP.NET 网站组件CYQ.IIS发布--网站项目展示必备工具

前言&#xff1a;曾经&#xff0c;为了让秋色园更方便的在本地运行部署&#xff0c;辛苦写了一个“秋色园QBlog博客一键安装工具技术实现[附源码下载] ”。 不过这个工具也有一些不足&#xff0c;比如Win7就会出问题&#xff0c;另外IIS装的不好&#xff0c;也会有问题&#xf…

【转】关于大型网站技术演进的思考(十五)--网站静态化处理—前后端分离—中(7)...

上篇里我讲到了一种前后端分离方案&#xff0c;这套方案放到服务端开发人员面前比放在web前端开发人员面前或许得到的掌声会更多&#xff0c;我想很多资深前端工程师看到这样的技术方案可能会有种说不出来的矛盾心情&#xff0c;当我的工作逐渐走向越来越专业化的前端开发后&am…

【转】大型网站架构演变和知识体系

大型网站架构演变和知识体系 之前也有一些介绍大型网站架构演变的文章&#xff0c;例如LiveJournal的、ebay的&#xff0c;都是非常值得参考的&#xff0c;不过感觉他们讲的更多的是每次演变的结果&#xff0c;而没有很详细的讲为什么需要做这样的演变&#xff0c;再加上近来感…

查找网站的IP地址的两种方法

一、浏览器查询 1、打开任意一个浏览器&#xff0c;在输入框输入“IP查询”,会出现多个查询页面点击相关网址即可。 2、在其中输入要查询的网址域名后点击查询即可&#xff0c;下方解析地址即为该网站的IP地址。以CSDN为例&#xff1a;www.csdn.com。 二、CMD命令查询 打开电…

c# 将图片转成透明背景的png 源代码_这五个免费的图片素材网站,让你不再为找素材而烦恼...

阿里巴巴矢量图库阿里巴巴不矢量图库是阿里巴巴的图标素材库&#xff0c;里面的图标素材具有以下特点&#xff1a;数量大&#xff0c;种类全&#xff0c;可自由变换颜色&#xff0c;可选择PNG&#xff0c;SVG 以及 AI 3种格式。比如我们搜索一个电脑&#xff1a;可以看到出现了…

检查网站目录下有bom的文件并移除bom

2019独角兽企业重金招聘Python工程师标准>>> <?php//remove the utf-8 boms//by magicbug at gmail dot comif (isset($_GET[dir])){ //config the basedir$basedir$_GET[dir];}else{$basedir .;}$auto 1;checkdir($basedir);function checkdir($basedir){if …

查询ecshop网站代码排查方法_「干货」连续行为事件的查询方法与实现(附代码)...

在日常业务中&#xff0c;客户行为事件表往往存储的是客户&#xff0c;行为明细&#xff0c;关键字段包括姓名、日期、事件标志等。为考察客户某一行为的连贯性&#xff0c;经常需要查询客户是否存在连续行为&#xff0c;如是否连续登录、连续签到、连续欠息、连续#逾期#等。#S…

【Android开发】网路编程及Internet应用-从指定网站上下载文件

利用前面学过的HttpUrlConnection和文件输入输出流来完成从Android端下载指定站点的文件。写一个编辑框&#xff0c;用来输入要下载文件的URL路径&#xff0c;下面一个按钮&#xff0c;点击实现文件下载res/layout/main.xml:<?xml version"1.0" encoding"ut…

网站架构资料收集整理

1.系统概况图 图1.1 系统架构概况图 图1.2 较为完整的系统架构图 2.系统使用的主要技术 下列排名不分先后 2.1前端 JavaScript&#xff0c;html&#xff0c;css&#xff0c;silverlight&#xff0c;flash Jquery Javascript类库&#xff0c;用来简化html的操作&#xff0c;事件…

jquery.superslide.js插件网站焦点新闻图片选项卡自动切换效果代码

2019独角兽企业重金招聘Python工程师标准>>> jquery.superslide.js插件网站焦点新闻图片选项卡自动切换效果代码http://www.17sucai.com/pins/7117.html 转载于:https://my.oschina.net/u/1266171/blog/670036

Python之Scrapy爬虫(热门网站数据爬取)

第一关&#xff1a;猫眼电影排行TOP100信息爬取 代码&#xff1a; item.py文件 import scrapy class MaoyanItem(scrapy.Item):#********** Begin **********#name scrapy.Field()starts scrapy.Field()releasetime scrapy.Field()score scrapy.Field()#********** End…

2015年免费的25款 WordPress 网站模板

2015年 WordPress 插件和主题的数量继续在增长。这一年&#xff0c;我们可以期待WP主题引入一些新的技术&#xff0c;从背景&#xff0c;自适应响应式图像到从背景图片中提取主色。 本文包含25款最近发布的 WordPress 主题列表。这些主题都是优质&#xff0c;免费的&#xff0c…

wordpress和传统网站的加载性能优化

前言 网站的性能优化是非常重要的&#xff0c;直接决定了用户体验&#xff0c;和网站的负载能力。 Wordpress是一款非常受欢迎的Blog/CMS开源软件。全球数百万的网站使用wordpress搭建。 那么&#xff0c;如何让wordpress的性能、效能达到最佳&#xff0c;在减少服务器负荷的情…