前端页面性能优化(前端页面性能优化指标有哪些)
大家好!今天让创意岭的小编来大家介绍下关于前端页面性能优化的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。
开始之前先推荐一个非常厉害的Ai人工智能工具,一键生成原创文章、方案、文案、工作计划、工作报告、论文、代码、作文、做题和对话答疑等等
只需要输入关键词,就能返回你想要的内容,越精准,写出的就越详细,有微信小程序端、在线网页版、PC客户端
创意岭作为行业内优秀的企业,服务客户遍布全球各地,如需了解SEO相关业务请拨打电话175-8598-2043,或添加微信:1454722008
本文目录:
一、常用的前端性能优化方法有哪些?
1、减少http请求,合理设置 HTTP缓存
2、使用浏览器缓存
3、启用压缩
4、CSS Sprites,合并 CSS图片,减少请求数
5、CSS放在页面最上部,javascript放在页面最下面
前端对于网站来说,通常是指,网站的前台部分包括网站的表现层和结构层。因此前端技术一般分为前端设计和前端开发,前端设计一般可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括基本的HTML和CSS以及JavaScript/ajax,现在最新的高级版本HTML5、CSS3,以及SVG等。
二、浏览器层合成与页面性能优化
一个web页面由多层构成的
比如掘金:
浏览器渲染页面
在编写页面中,我们要知道浏览器如何处理 HTML、JavaScript 和 CSS。 需要了解并注意五个主要区域, 这些我们拥有控制权的部分,也是像素至屏幕管道中的关键点。
每一步简介
• JavaScript。 一般来说,我们会使用 JavaScript 来实现一些视觉变化的效果。比如用 jQuery 的 animate 函数做一个动画、对一个数据集进行排序或者往页面里添加一些 DOM 元素等。当然,除了 JavaScript,还有其他一些常用方法也可以实现视觉变化效果,比如:CSS Animations、Transitions 和 Web Animation API。• 样式计算。 此过程是根据匹配选择器(例如 .headline 或 .nav > .nav__item)计算出哪些元素应用哪些 CSS 规则的过程。从中知道规则之后,将应用规则并计算每个元素的最终样式。• 布局。 在知道对一个元素应用哪些规则之后,浏览器即可开始计算它要占据的空间大小及其在屏幕的位置。网页的布局模式意味着一个元素可能影响其他元素,例如 元素的宽度一般会影响其子元素的宽度以及树中各处的节点,因此对于浏览器来说,布局过程是经常发生的。• 绘制。 绘制是填充像素的过程。它涉及绘出文本、颜色、图像、边框和阴影,基本上包括元素的每个可视部分。绘制一般是在多个表面(通常称为层)上完成的。• 合成。 由于页面的各部分可能被绘制到多层,由此它们需要按正确顺序绘制到屏幕上,以便正确渲染页面。对于与另一元素重叠的元素来说,这点特别重要,因为一个错误可能使一个元素错误地出现在另一个元素的上层。
ps: 当然,不是每一步更改都会遵循上图这个流程。
每一步不是必经的
比如:
•更改了元素的布局相关的属性:width, height, 位置... 那么浏览器就会检查其他元素,自动 重排一次 。•更改了元素的 color, 阴影... 不会影响页面的布局,那么浏览器就会跳过布局。这就是我们平常说的:重排一定引起重绘,重绘不一定引起重排。•如果更改了 一个既不会布局,也不会绘制的属性,那么浏览器直接跳到最后一步,不得不说,这是最高效的
使用 csstriggers[1] 可以详细看到 css 属性改变时触发的流程。
如何提升绘制的性能
尽量使用影响较少的属性
举个🌰:
<div class="box box1">1</div><div class="box box2"> 2 </div> <script> const box1 = document.querySelector('.box1'); setTimeout(() => { box1.style.display = 'none' }, 3000); </script>
我们可以看到,box1 和 box2 都绿(重绘)了一次,说明 box1 的变化影响了 box2。那这个属性变化的代价是比较大的。
假如是我让 box1 的位置 向右移动 60px,我们做如下更改:
document.querySelector('.box1').style.transform = 'translateX(60px)';
现在 box2的位置不受影响,直观地看到 box2是没被绿(重绘)的。
提升为合成层(Compositing Layers)
我们在上一步做了优化,box2 已经不受影响,但是box1 依然被重绘,那能不能在优化呢。 答案是能的。 left 这个属性的改变会造成的影响是:
layout -> painted -> composited
这个流程可以在 csstriggers[2] 看到。
那现在我们要找到一个 css 属性,既能让元素位移,又能造成的影响最小。
答案是有的: transform:影响最小,直接到达最后一步 Composite 。 做如下更改:
box1.style.transform = 'translateX(60px)'
好像事与愿违。box1, box2 都被重绘了。
这里因为: 他们都在一个层上,一个元素的变化也影响了其他元素。浏览器会联合需要绘制的区域,而导致整个屏幕重绘。
为了直接到达最后一步 Composite 。其实这里有个条件: 更改属性所在的元素应处于其自身的合成层,如果没在,我们可以提升为合成层` 这样就不会影响其他元素,而能减少绘制区域。
提升为合成层的原因有一下几种
这里我大概罗列了这么多
•video•有 3D transform•backface-visibility 为 hidden•对 opacity、transform、fliter、backdropfilter 应用了 animation 或者 transition(需要是 active 的 animation 或者 transition,当 animation 或者 transition 效果未开始或结束后,提升合成层也会失效)•will-change 设置为 opacity、transform、top、left、bottom、right(其中 top、left 等需要设置明确的定位属性,如 relative 等)•重叠原因
在 box1 上面做如下更改:
will-change: transform;
再次观察效果:
大功告成:
•box1 不在重绘了•box2 不受影响 我们可以查看最终的分层效果:
和 ps 里面的图层差不多,每一个图层叠加在一起组成我们看到的网页。
好处
提升为合成层简单说来有以下几点好处:
•合成层的位图,会交由 GPU 合成,比 CPU 处理要快•当需要 repaint 时,只需要 repaint 本身,不会影响到其他的层•对于 transform 和 opacity 效果,不会触发 layout 和 paint
建议:
由于 transition animation 也有提升层的作用,所以动画可以优先考虑 css3 动画。
物极必反
图层越多越好吗? 当然不是。提升合成层也得 消耗额外的内存和管理资源 ,
正所谓切勿提前优化.
正如MDN所说: 如果你的页面在性能方面没什么问题,则不要添加 will-change 属性来榨取一丁点的速度。 will-change 的设计初衷是作为最后的优化手段,用来尝试解决现有的性能问题.
参考
前端性能优化之 Composite[3]
关键转译路径 Critical Rendering Path[4]
will-change[5]
坚持仅合成器的属性和管理层计数[6]
最后
如果喜欢本篇文章,可以关注的微信公众号,如果不嫌烦,还可以把它添加到桌面😀。
References
[1] csstriggers: https://csstriggers.com/
[2] csstriggers: https://csstriggers.com/
[3] 前端性能优化之 Composite: https://zhuanlan.zhihu.com/p/41472193
[4] 关键转译路径 Critical Rendering Path: https://cythilya.github.io/2018/07/13/critical-rendering-path/#browser-rendering-pipeline
[5] will-change: https://developer.mozilla.org/zh-CN/docs/Web/CSS/will-change
[6] 坚持仅合成器的属性和管理层计数: https://developers.google.com/web/fundamentals/performance/rendering/stick-to-compositor-only-properties-and-manage-layer-count
三、前端优化-LCP
LCP是最大内容绘制的简称。LCP是用来测量感知加载速度。感知加载速度是以用户为中心的重要指标。因为该项指标会在页面的主要内容基本加载完成时,在页面加载时间轴中标记出相应的点,迅捷的LCP有助于让用户确信页面时有效的。以前的指标测量比如load(加载)或者DOMContentLoad(DOM内容加载完毕)并不是很好,因为这些指标并不一定与用户看到的内容相对应。而向First Contentful Paint 首次内容的绘制(FCP)这类以用户为中心的新指标只会捕获加载最开始的部分。如果某个页面显示时一段启动动画或者加载之时,那么这些时刻与用户的关联性并不大。First Meaningful Paint 首次有效绘制(FMP)和Speed Index速度指数(SI),这些指标能够捕获到更多初始后的加载速度,但是这些指标复杂,难以理解,而且容易出错。
LCP指标会根据页面首次开始加载的时间点来报告可视区域可见的最大图像或者文本完成渲染的相对时间.良好的LCP的时间时2.5,较差的值为4.0s.最大内容的绘制考量的元素类型为
报告给最大内容绘制的元素大小通常时用户在可视区域可见的大小,如果元素延伸到可视区域之外,或者任何元素被剪裁或者包含不可见的溢出,那么这部分不计入元素的带线啊哦。对于在原始尺寸之上经过调整的图像元素,报告给指标的元素大小为可见尺寸或者原始尺寸。
网页通常时分阶段加载的,因此,页面上最大元素也可能会发生变化。为了应对这种潜在的变化,浏览器会绘制第一帧立即发送一个largest-contentful-paint类型的PerformanceEntry,用于识别最大内容元素,但是,在渲染后续帧之后,浏览器会在最大内容元素发生变化时候分发另一个PerfornacneFanceEntry。需要主要的是,一个元素只能在渲染完成并且对用户可见之后才视为最大元素,尚未加载点额元素不能视为渲染完成。在字体阻塞期使用网页字体的文本节点也是这样。在这种情况下,较小的元素可能会被报告称最大元素,但一旦更大的元素完成渲染,就会通过另外一个PerformanceEntry对象进行报告
为了使计算和分发新性能条目的性能开销保持在较低的水平,对元素大小或者位置的更改不会生成新的LCP候选对象,只有元素在可视区域的初始化大小和位置会纳入考量范围。也就是说,最初在屏幕外完成渲染,然后过滤到屏幕上的图像可能不会得到报告,这也意味着最初可视区域内进行渲染,然后被推出到可视区域外的元素人讲报告其在可视区域的初始化大小
LCP主要受四个因素影响
四、如何进行网站性能优化
一、前端优化
网站性能优化是一个很综合的话题,涉及到服务器的配置和网站前后端程序等各个方面,我只是从实际经历出发,分享一下自己所尝试过的网站性能优化方法。之所以在标题上挂一个web2.0,是因为本文更偏重于中小网站的性能优化,我所使用的系统也是典型web2.0的LAMP架构。
首先讲讲前端的优化,用户访问网页的等待时间,有80%是发生在浏览器前端,特别是页面和页面中各种元素(图片、CSS、Javascript、 flash…)的下载之上。因此在很多情况下,相对于把大量的时间花在艰苦而繁杂的程序改进上,前端的优化往往能起到事半功倍的作用。雅虎最近将内部使用的性能测试工具yslow向第三方公开,并发布了著名的网站性能优化的十三条规则,建议你下载并安装yslow,并作为测评网站优化效果的工具。下面我挑其中特别有价值的具体说明一下优化的方法:
对于第一次访问您网站,尚未在浏览器cache中缓存您网站内容的用户,我们可以做的事情包括:
1)减少一个页面访问所产生的http连接次数
对于第一次访问你网站的用户,页面所产生的http连接次数是影响性能的一个关键瓶颈。
对策:
- 尽量简洁的页面设计,最大程度减少图片的使用,通过放弃一些不必要的页面特效来减少javascript的使用。
- 使用一些优化技巧,比如利用图片的背景位移减少图片的个数;image map技术;使用Inline images将css图片捆绑到网页中。
- 尽量合并js和css文件,减少独立文件个数。
2) 使用gzip压缩网页内容
使用gzip来压缩网页中的静态内容,能够显著减少用户访问网页时的等待时间(据说可达到60%)。主流的web服务器都支持或提供gzip压缩,如果使用apache服务器,只需要在配置文件中开启 mod_gzip(apache1.x)或mod_deflate(apache2.x)即可。凡是静态的页面,使用gzip压缩都能够显著提高服务器效率并减少带宽支出,注意图片内容本身已经是压缩格式了,务必不要再进行压缩。
3)将CSS放在页面顶端,JS文件放在页面底端
CSS的引用要放在html的头部header中,JS文件引用尽量放在页面底端标签的后面,主要的思路是让核心的页面内容尽早显示出来。不过要注意,一些大量使用js的页面,可能有一些js文件放在底端会引起一些难以预料的问题,根据实际情况适当运用即可。
4)使JS文件内容最小化
具体来说就是使用一些javascript压缩工具对js脚本进行压缩,去除其中的空白字符、注释,最小化变量名等。在使用gzip压缩的基础上,对js内容的压缩能够将性能再提高5%。
5)尽量减少外部脚本的使用,减少DNS查询时间
不要在网页中引用太多的外部脚本,首先,一次dns的解析过程会消耗20-120毫秒的时间;其次,如果在页面中引用太多的外部文件(如各种广告、联盟等代码),可能会因为外部文件的响应速度而将你的网站拖得很慢。如果不得不用,那么就尽量将这些脚本放在页脚吧。不过有一点需要提及,就是浏览器一般只能并行处理同一域名下的两个请求,而对于不同子的域名则不受此限制,因此适当将本站静态内容(css,js)放在其他的子域名下(如 static.xxx.com)会有利于提高浏览器并行下载网页内容的能力。
对于您网站的经常性访问用户,主要的优化思路就是最大限度利用用户浏览器的cache来减少服务器的开销。
1)在header中添加过期时间(Expires Header)
在header中给静态内容添加一个较长的过期时间,这样可以使用户今后访问只读取缓存中的文件,而不会与服务器产生任何的交互。不过这样做也存在一些问题,当图片、CSS和js文件更新时,用户如果不刷新浏览器,就无法获得此更新。这样,我们在对图片、css和js文件修改时,必须要进行重命名,才能保证用户访问到最新的内容。这可能会给开发造成不小的麻烦,因为这些文件可能被站点中的许多文件所引用。flickr提出的解决办法是通过url rewrite使不同版本号的URL事实上指向同一个文件,这是一个聪明的办法,因为url级别的操作效率是很高的,可以给开发过程提供不少便利。
要理解为什么这样做,必须要了解浏览器访问url时的工作机制:
a. 第一次访问url时,用户从服务器段获取页面内容,并把相关的文件(images,css,js…)放在高速缓存中,也会把文件头中的expired time,last modified, ETags等相关信息也一同保留下来。
b. 用户重复访问url时,浏览器首先看高速缓存中是否有本站同名的文件,如果有,则检查文件的过期时间;如果尚未过期,则直接从缓存中读取文件,不再访问服务器。
c. 如果缓存中文件的过期时间不存在或已超出,则浏览器会访问服务器获取文件的头信息,检查last modifed和ETags等信息,如果发现本地缓存中的文件在上次访问后没被修改,则使用本地缓存中的文件;如果修改过,则从服务器上获取最新版本。
我的经验,如果可能,尽量遵循此原则给静态文件添加过期时间,这样可以大幅度减少用户对服务器资源的重复访问。
2)将css和js文件放在独立外部文件中引用
将css和js文件放在独立文件中,这样它们会被单独缓存起来,在访问其他页面时可以从浏览器的高速缓存中直接读取。一些网站的首页可能是例外的,这些首页的自身浏览可能并不大,但却是用户访问网站的第一印象以及导向到其他页面的起点,也可能这些页面本身使用了大量的ajax局部刷新及技术,这时可以将 css和js文件直接写在页面中。
3)去掉重复的脚本
在IE中,包含重复的js脚本会导致浏览器的缓存不被使用,仔细检查一下你的程序,去掉重复引用的脚本应该不是一件很难的事情。
4)避免重定向的发生
除了在header中人为的重定向之外,网页重定向常在不经意间发生,被重定向的内容将不会使用浏览器的缓存。比如用户在访问,服务器会通过301转向到/,在后面加了一个“/”。如果服务器的配置不好,这也会给服务器带来额外的负担。通过配置apache的 alias或使用mod_rewrite模块等方法,可以避免不必要的重定向。
还有一些,比如使用CDN分发机制、避免CSS表达式等、避免使用ETags等,因为不太常用,这里就不再赘述了。
做完了上述的优化,可以试着用yslow测试一下网页的性能评分,一般都可以达到70分以上了。
当然,除了浏览器前端和静态内容的优化之外,还有针对程序脚本、服务器、数据库、负载的优化,这些更深层次的优化方法对技术有更高的要求。本文的后半部分将重点探讨后端的优化。
二、后端优化
上次写完web2.0网站前端优化篇之后,一直想写写后端优化的方法,今天终于有时间将思路整理了出来。
前端优化可以避免我们造成无谓的服务器和带宽资源浪费,但随着网站访问量的增加,仅靠前端优化已经不能解决所有问题了,后端软件处理并行请求的能力、程序运 行的效率、硬件性能以及系统的可扩展性,将成为影响网站性能和稳定的关键瓶颈所在。优化系统和程序的性能可以从以下的方面来入手:
1)apache、mysql等软件的配置的优化
尽管apache和mysql等软件在安装后使用的默认设置足以使你的网站运行起来,但是通过调整mysql和apache的一些系统参数,还是可以追求更高的效率和稳定性。这个领域中有很多专业的文章和论坛(比如: ),要想掌握也需要进行深入的研究和实践,这里就不重点讨论了。
2)应用程序环境加速
这里仅以我最常应用的php开发环境为例,有一些工具软件可以通过优化PHP运行环境来达到提速的目的,其基本原理大致是将PHP代码预编译并缓存起来,而不需要改变任何代码,所以比较简单,可以将php的运行效率提升50%以上。比较常用的php加速工具有:APC( http: //pecl.php.net/package-info.php?package=APC)、Turck MMCache( )、php accelebrator(),还有收费的Zend Performance Suite
3)将静态内容和动态内容分开处理
apache是一个功能完善但比较庞大的web server,它的资源占用基本上和同时运行的进程数呈正比,对服务器内存的消耗比较大,处理并行任务的效率也一般。在一些情况下,我们可以用比较轻量级的web server来host静态的图片、样式表和javascript文件,这样可以大大提升静态文件的处理速度,还可以减少对内存占用。我使用的web server是来自俄罗斯的nginx,其他选择方案还包括lighttpd和thttpd等。
4)基于反向代理的前端访问负载均衡
当一台前端服务器不足以应付用户访问时,通过前端机实现web访问的负载均衡是最快速可行的方案。通过apache的mod_proxy可以实现基于反向代理的负载均衡,这里推荐使用nginx做代理服务器,处理速度较apache更快一些。
5)应用缓存技术提高数据库效能,文件缓存和分布式缓存
数据库访问处理并发访问的能力是很多网站应用的关键瓶颈,在想到使用主从结构和多farm的方式构建服务器集群之前,首先应该确保充分使用了数据库查询的缓存。一些数据库类型(如mysql的innoDB)自身内置对缓存的支持,此外,还可以利用程序方法将常用的查询通过文件或内存缓存起来。比如通过 php中的ob_start和文件读写函数可以很方便的实现文件形式的缓存,而如果你拥有多台服务器,可以通过memcache技术通过分布式共享内存来对数据库查询进行缓存,不仅效率高而且扩展性好,memcache技术在livejournal和Craigslist.org等知名网站应用中都得到了检验。
6)服务器运行状态的检测,找到影响性能的瓶颈所在
系统优化没有一劳永逸的方法,需要通过检测服务器的运行状态来及时发现影响性能的瓶颈,以及可能存在的潜在问题,因为网站的性能,永远取决于木桶中的短板。可以编写一些脚本来检测web服务的运行,也有一些开源的软件也提供了很好的功能
7)良好的扩展架构是稳定和性能的基础
一些技巧和窍门可以帮你度过眼前的难关,但要想使网站具备应付大规模访问的能力,则需要从系统架构上进行彻底的规划,好在很多前人无私的把他们架构
网站的经验分享给我们,使我们可以少走甚多弯路。我最近读到的两篇有启发的文章:
- 从LiveJournal后台发展看大规模网站性能优化方法
- Myspace的六次重构
最后不得不提到程序编码和数据库结构对性能的影响,一系列糟糕的循环语句,一个不合理的查询语句、一张设计不佳的数据表或索引表,都足以会使应用程序运行的速度成倍的降低。培养全局思考的能力,养成良好的编程习惯,并对数据库运行机制有所了解,是提高编程质量的基础。
以上就是关于前端页面性能优化相关问题的回答。希望能帮到你,如有更多相关问题,您也可以联系我们的客服进行咨询,客服也会为您讲解更多精彩的知识和内容。
推荐阅读: