最全前端性能优化总结 (前端性能指标参考)

本文目录导航:
最全前端性能优化总结
最全前端性能优化总结前端性能优化分两局部1、加载性能优化
2、渲染性能优化
一、加载性能优化实质:
1、增加恳求次数;
2、增加恳求资源的大小;
3、网络优化;
1、增加恳求次数为什么增加恳求次数?阅读器能够并行收回恳求,然而每次并行收回恳求的个数是有限制的,以chrome为例:
同一域名下,同一GET恳求的并发数是1,也就是说上一个恳求完结,才会口头下一个恳求,否则置入队列期待发送;
同一域名下,不同GET/POST恳求的并发数量是6。
当发送的恳求数量到达6个,并且都没有失掉照应时,前面的恳求会置入队列期待发送。
所以资源恳求数过多必需比恳求数少更耗时,直接影响网页的加载速度;
增加恳求次数模式1)图片资源
CSS雪碧图技术
把一些罕用、重复经常使用的小图兼并成一张大图,经常使用的时刻经过背景图片定位(background-position),定位到详细的某一张小图上;
1、UI给图;
2、webpack插件:webpack-spritesmith
图片懒加载
视区外图片先不加载,当进入视区或许进入视区之前的某个位置加载;
1、css的loading属性;
2、getBoundingClientRect方法,失掉dom元素的top、left、bottom、right、height、width消息,对比视区大小,启动图片加载(要求联合节流);
3、IntersectionOberser方法,能够监听元素能否抵达以后视口的事情;
字体图标
一个图标字体比一系列图像要小,一旦图标字体加载了,图标就会马上渲染进去,不要求下载一个图像,可以增加HTTP恳求。
base64编码
图片的base64编码就是可以将一张图片数据编码成一串字符串,经常使用该字符串替代图像地址url;
(平衡css体积增大和http恳求增加之间的收益)
2)正当应用缓存
防止一行代码修正造成整个bundle的缓存失效
阅读器缓存(资源)
强缓存
协商缓存
DNS缓存(DNS查找期间)
分包加载(BundleSpliting)
3)兼并CSS和JS文件
将CSS和JavaScript文件兼并为独自的文件。兼并CSS和JavaScript文件是增加HTTP恳求数量和提高网站加载速度的有效方法;
2、增加资源大小相反网络环境下,更小体积象征着传输速度更快;
增加资源大小模式1)资源紧缩
图片紧缩工具:tinyPng等
图片格局:,webp普遍比jpeg/png更小,而avif又比webp小一个级别
如何甄别阅读器能否支持webp?
经过canvas来判别(这个比拟罕用),创立一个canvas元素,而后把它转成image/webp格局的data_url,假设这个data_url外面蕴含webp,则代表以后阅读器支持webp格局,反之则不支持(canvas)(image/webp)(data:image/webp)
在服务端依据恳求header消息判别阅读器能否支持webp:在图片恳求收回的时刻,RequestHeaders里有Accept,服务端可以依据Accept外面能否有image/webp启动判别。
经过加载一张webp图片启动判别:先加载一个WebP图片,假设能失掉到图片的宽度和高度,就说明是支持WebP的;
gzip紧缩:nginx性能中可以开启,资源传输体积紧缩变小,相应会参与主机紧缩和阅读器资源解压的压力;关于图片资源紧缩效率不显著;
Terser等工具是Javascript资源紧缩混杂的神器。对代码层启动处置,比如:
1、长变量名交流短变量;
2、删除空格换行符;
3、估量算才干;
4、移除不可被口头的代码;
5、移除无用的变量及函数
js、css、html资源紧缩
图片资源紧缩
2)TreeShaking技术
TreeShaking:无用导出将在消费环境启动删除,抵达增加资源体积的成果;
3、网络优化1)CND:就近准则
多路复用,在阅读器可并行发送N条恳求。
首部紧缩,更小的负载体积。
恳求优先级,更快的关键恳求
其余路由懒加载
第三方组件按需加载
二、渲染性能优化阅读器渲染环节解析HTML生成DOM树。
解析CSS生成CSSOM规定树。
解析JS,操作DOM树和CSSOM规定树。
将DOM树与CSSOM规定树兼并在一同生成渲染树。
遍历渲染树开局规划,计算每个节点的位置大小消息。
阅读器将一切图层的数据发送给GPU,GPU将图层分解并显示在屏幕上。
重排当扭转DOM元素位置或大小时,会造成阅读重视重生成渲染树,这个环节叫重排。
重绘当重重生成渲染树后,就要将渲染树每个节点绘制到屏幕,这个环节叫重绘。
不是一切的举措都会造成重排,例如扭转字体色彩,只会造成重绘。
重排和重绘这两个操作代价十分大,由于JavaScript引擎线程与GUI渲染线程是互斥,它们同时只能一个在上班,因此重排和重绘会阻塞主线程。
渲染性能优化模式1)资源加载优先级控制
css引入放在head便签尾部,script脚本防砸body标签尾部;
脚本与DOM/其它脚本的依赖相关很强:对<script>设置defer
脚本与DOM/其它脚本的依赖相关不强:对<script>设置async
preload加载以后路由必需资源,优先级高,普通关于Bundle资源经常使用preload;
refetch优先级低,在阅读器idle形态时加载资源,普通用以加载非首页资源;
preload/prefetch
preload/prefetch可控制HTTP恳求优先级,从而到达关键恳求更快照应的目的;
dns-prefetch,可对主机地址的DNS启动预解析。
js和css的引上天位/script类型设置
2)增减轻排重绘
增加页面DOM操作;
对DOM元素口头一系列操作,可以将DOM元素脱离文档流,修正成功后,再将它带回文档。例如:暗藏元素(display:none)、文档碎片(DocumentFragement)等(虚构dom);
用JavaScript修正样式时,最好不要直接修正单个样式属性,而是交流class来扭转样式;
正当经常使用防抖和节流;
3)应用缓存
页面缓存(keep-alive),接口缓存(减少数据降级造成的页面刷新)
4)WebWorker
三、页面加载目的API目的domainLookupStart/domainLookupEnd:DNS域名查问开局/完结的期间,假设经常使用了本地缓存(即无DNS查问)或耐久衔接,则与fetchStart值相等;
connectStart:HTTP(TCP)开局/从新建设衔接的期间,假设是耐久衔接,则与fetchStart值相等。
requestStart:HTTP恳求读取实在文档开局的期间(成功建设衔接),包括从本地读取缓存。
responseStart:HTTP开局接纳照应的期间(失掉到第一个字节),包括从本地读取缓存。
responseEnd:HTTP照应所有接纳成功的期间(失掉到最后一个字节),包括从本地读取缓存。
domLoading:开局解析渲染DOM树的期间,此时变为loading,并将抛出readystatechange相关事情。
domInteractive:成功解析DOM树的期间,变为interactive,并将抛出readystatechange相关事情,留意只是DOM树解析成功,这时刻并没有开局加载网页内的资源。
domContentLoadedEventStart:DOM解析成功后,网页内资源加载开局的期间,在DOMContentLoaded事情抛出前出现。
domContentLoadedEventEnd:DOM解析成功后,网页内资源加载成功的期间(如JS脚本加载口头终了)。
domComplete:DOM树解析成功,且资源也预备就绪的期间,变为complete,并将抛出readystatechange相关事情。
loadEventStart:load事情发送给文档,也即load回调函数开局口头的期间。
loadEventEnd:load事情的回调函数口头终了的期间。
页面目的白屏期间
指阅读器动员恳求到开局显示第一个页面元素的期间。
现代阅读器不会期待CSS树(一切CSS文件下载和解析成功)和DOM树(整个body标签解析成功)构建成功才开局绘制,而是马上开局显示两边结果。
所以经常在低网速的环境中,观察到页面由上至下缓慢显示完,或许先显示文本内容后再重绘成带有格局的页面内容。
首屏期间
首屏期间(FirstScreenTime),是指用户看到第一屏,即整个网页顶部大小为以后窗口的区域,显示完整的期间。
罕用的方法有,页面标签标志法、图像相似度比拟法和首屏高度内图片加载法。
可交互期间
用户可以启动反常的点击、输入等操作,自动可以统计DOMContentLoaded事情出现的期间。
整页期间
整页期间(PageLoadTime),页面一切资源都加载成功并出现进去所花的期间,这个就是load事情出现的期间。
DevTools目的在经常使用GoogleChrome开发者工具的是,经常使用Network测试网络性能时刻,上方有三个期间。
Finish:1.31s-示意整个页面加载期间为640ms,包括load事情出现后还有一些异步资源也加载成功。
DOMContentLoaded:329ms-出当初页面DOMContentLoaded事情的启动期间点。
Load:1.25s-示意页面load事情的启动期间点。
原文:
经常出现的前端集成部署打算有哪些?各自的优缺陷是什么?
1. 开发规范 在前端开发中,规范表演着至关关键的角色。
它不只包括代码编写和部署的目录规范,还有编码规范等。
良好的规范能够极大地优化开发效率,低劣的规范不会让开发者感到约束,而是协助他们极速定位并处置疑问,从而提高上班效率。
2. 模块化开发 模块化开发关键针对JavaScript和CSS,以性能或业务单元来组织代码。
在JavaScript方面,它处置了独立作用域、依赖治理、API泄露、按需加载与口头、以及安保兼并等疑问;在CSS方面,则处置了依赖治理、组件外部样式治理等疑问。
这是提高前端开发效率的关键基础。
目前盛行的模块化框架包括RequireJS和SeaJS等。
3. 组件化开发 基于模块化的基础上,组件化开发以页面小部件(Component)为单位,将页面小部件的JavaScript、CSS、HTML代码片段放在一同启动开发和保养。
组件单元是资源独立的,可以在系统中复用。
例如,头部(Header)、尾部(Footer)、搜查框(SearchBar)、导航(Menu)、对话框(Dialog)等,甚至一些复杂的组件如编辑器(Editor)等。
通常业务会针对组件化的JavaScript局部启动必要的封装,处置一些经常出现的组件渲染、交互疑问。
4. 组件仓库 随着组件化的遍及,人们宿愿将一些十分通用的组件放在一个公共的中央供团队共享,这时就要求引入组件仓库。
如今盛行的组件库有Bower和Component等。
团队开展到必定规模后,对组件库的需求会变得十分剧烈。
5. 性能优化 性能优化是指经过工程手腕保障的性能优化点。
由于内容丰盛,不再详细开展。
性能优化是前端名目开展到必定阶段必需教训的环节。
要求强调的是,性能优化必定是一个工程疑问和战略疑问。
不能用工程手腕保障的性能优化是不靠谱的,优化时只思考一个页面的初次加载,不思考全局在微观统计上的优化优化也是全面的。
6. 名目部署 只管名目部署依照现行的行业规范,不属于前端的上班范围,但它对性能优化有直接的影响,包括静态资源缓存、CDN、非笼罩式颁布等疑问。
正当的静态资源部署可认为前端性能带来较大的优化空间。
7. 开发流程 完整的开发流程包括本地开发调试、视觉成果走查确认、前后端联调、提测、上线等环节。
对开发流程的改善可以大幅降落开发的期间老本。
曾经见过很多独立的系统(如CMS系统、静态资源推送系统)将开发流程割裂开,对前端开发的效率有严重的阻碍。
8. 开发工具 这里所说的工具指的是工程工具,包括构建与优化工具、开发-调试-部署等流程工具,以及组件库失掉、提交等相关工具,甚至经营、文档、性能颁布等平台工具。
前端开发要求工具支持,这个疑问的基本要素来自前端畛域言语特性。
前端开发所经常使用的言语(如JavaScript、CSS、HTML)以及前端工程资源的加载与定位战略选择了前端工程必要求工具支持。
由于这些工具通常都是独立的系统,要求将它们串联起来,因此出现了Yeoman这样的封装工具。
前面提到的七项技术元素都直接或直接地对前端开发工具设计发生必定的影响。
因此,能否串联其余技术元素,使得前端开发构成一个连接可继续优化的开发体系,工具的设计至关关键。
9个前端性能优化的最佳通常
现代互联网时代,关上一个Web平台,是留下还是退出,只有要1分钟,因此前端的性能优化至关关键。
由于前端优化不佳,大少数网站不可提供令人满意的用户体验,最经常出现的状况是数据加载和图像优化不佳,本文分享几个优化战略。
资源最小化
资源(静态资源)紧缩是指从HTML、CSS和JavaScript中删除不要求加载的不用要的冗余数据的环节。
这包括删除代码注释和格局、空白字符、未经常使用的代码、换行符等。
增加HTML、CSS和JavaScript将放慢前端加载期间,由于它增加了要求从主机恳求的代码量。
生成HTML、CSS和JavaScript代码的优化版本可以借助工具,如下:
HTML:PageSpeedInsights、HTMLMinifier。
CSS、ChromeDevTools中的Coverage工具、YUICompressor。
JavaScript:JSMin、ChromeDevTools中的Coverage工具。
紧缩文件关于WEB名目,文件越大,加载所需的期间就越长,现代WEB平台通常有少量的HTML、CSS和JavaScript包。
经过经常使用适合的方法紧缩文件,可以轻松地对前端的加载期间发生严重影响。以下是可以遵照的两个不错的文件紧缩选项:
Gzip:最盛行的数据紧缩和解紧缩方法,一切现代阅读器都支持,Gzip在将站点的HTML、CSS和JavaScript包发送到阅读器之前先在主机端对其启动紧缩,而后在客户端解紧缩文件并传送内容。
Brotli:与以后可用的紧缩方法相比,它提供了最佳的紧缩率,依据CertSimple的钻研,Brotli紧缩JavaScript文件比Gzip小14%,而HTML和CSS紧缩率比Gzip好21%和17%。
说到网站,图像是关键的组成局部,互联网上93.7%的网站至少经常使用一种图像文件格局,由于它们有助于提高用户介入度,愈加吸援用户眼球。
然而,经常使用图像的负面影响是会对前端加载期间发生不利影响。然而,如今有多种模式可以优化图像:
经常使用webp或avif经常使用webp和avif等新图像格局比jpg和png等旧格局具备更好的性能。
webp比png小26%,比jpg小25-35%。
avif比jpg小50%,比webp小20%。
然而,缺陷是阅读器支持还不够普遍。
webp最近取得了阅读器支持的普遍支持,或许存在旧版本不支持它。
另一方面,avif仅在Chrome和Opera中失掉了支持。
增加图像加载期间和提高网站性能的另一种方法是经常使用照应式图像。
超越50%的流量来自自动手机敌对板电脑,将图像缩放到干流设施尺寸并经常使用。
除了选用适合的格局和尺寸外,还有其余几种方法,经过图像优化来增加前端加载期间,以下是可以经常使用的一些其余方法:
图像紧缩
经常使用渐进式JPEG
为衔接速度较慢的用户提供较小的图像
经常使用HTTP/2、HTTP/3而不是HTTP/1.1
经常使用图像集
增加主机调用次数
通常,前端向主机收回的恳求越多,加载的期间就越长。
由于在出现页面之前,向主机发送任何恳求都要求齐全通讯。
可以经过多种模式来增加加载页面所需的主机恳求数量。
CSSSprites:这是增加主机调用次数的最简双方法之一,关键是增加UI相关的图片资源。
成功原理不是加载10个独立的图像到网站,而是经常使用图像汇合拼接成一个图像文件,而后经过经常使用CSS中的background-image和background-position属性来显示所需的图像区域。
这样做可以增加了所需的主机恳求数量。
增加第三方插件的少量外部恳求。
防止链接到不存在的文件。
此外,还可以检查主机端渲染以放慢运行程序的初始加载速度。
删除不用要的字体自定义字体曾经变得十分盛行,由于它有助于为网站参与共性化展现,但这些是以就义性能为代价。
自定义字体的大小或许十分大,特意是中文字体,而网络字体(例如Google字体)会将HTTP恳求参与到外部资源,这会影响页面渲染的速度。
以下是在网站中经常使用字体时可以采取的优化措施:
将字体转换为最有效的格局:加载像WOFF2这样的现代格局可以使字体文件大小比其余格局增加约30%。
子集字体以删除未经常使用的字符:综合字体文件蕴含许多或许永远不会经常使用的言语的字符。
经过子集字体,可以从字体中删除不要求的字符,只保管要求在网站上编写内容的内容。
预加载页面明白用到的字体。
提前加载
提前加载有助于进一步缩短前端加载期间。
经常使用提前加载,网页首先只加载要求的内容,并在用户要求时加载残余的内容。
除了提前占位符加载之外,还有其余几个选项,例如,原生提前加载和含糊图像成果。
缓存
假设不加缓存,用户每次访问都要求从新下载一切的资源,防止相似现象的最佳方法是经常使用缓存技术。
假设性能适当,阅读器会将文件存储在其本地缓存中,并防止为来自主机的后续页面访问加载相反的资源。
缓存主机:用户恳求从缓存主机汇合发送到最近的缓存主机,即CDN。
内存缓存:经过将数据的某些局部(例如:JavaScript变量)存储在内存中,无需为路由更改从新加载它们。
磁盘缓存:相似于内存缓存,不同之处在于它经常使用通常由阅读器处置的传统文件存储。
经常使用预取
资源预取是另一种可用于优化前端数据加载性能的增强技术。
作为开发人员,比阅读器更了解运行程序。
因此,预取经常使用此消息来揭示阅读器行将或许要求的资源。
预取加载资源以预期它们要求增加资源的期待期间。
关键有三种类型的预取。
只管链接预取是最盛行和最宽泛经常使用的方法,但DNS预取和预渲染也是有用的选项。
链接预取使阅读器能够搜集用户或许在最近的未来恳求的资源。
因此,开发人员可以假定用户或许访问特定网页的位置。
然而,链接预取仅实用于图像和JavaScript等可缓存资源。
DNS预取每当用户恳求托管在特定IP地址中的资产时,就会口头DNS查找以查找IP地址所属的域名。
DNS预取准许阅读器在后盾对网页中的链接口头DNS查找,同时用户阅读以后页面,以最大限制地增加用户在启用DNS预取的状况下单击链接时的提前。
CDN
前端内容(包括HTML页面、样式表、JavaScript文件和图像)的加载速度可以经常使用CDN启动优化,成果也是最显著的。
CDN是一组散布在多个天文位置的主机,用于存储内容的缓存版本以极速照应给最终用户。
还有一种特定类型的CDN,称为图像CDN,它十分长于优化图像。
有了这些,可以节俭40-80%的图像文件大小。
鉴于图像通常占据页面重量的一半以上,为图像集成CDN可以显着提高加载速度。
性能黄金规律:80-90%的最终用户照应期间用于下载前端组件,例如图像、样式表、脚本等。
因此,优化前端数据加载关于降落跳出率和参与用户在网站上的逗留期间至关关键。
作者:天行无忌
文章评论