前端性能优化的原则、方法

前端性能对用户体验至关重要,讲解性能优化的文章也很多,本文将介绍基本的原则和方法。

原则

性能优化的首要原则是,优先解决妨碍用户体验的问题。

通过使用工具对性能问题进行度量,确认问题所在并获取到可度量的数据,设计优化方案,执行优化方案后对考察的指标进行比对,最终确认验证是否生效。

什么最优先

用户打开一个网站,首屏多快速度加载出来,多长时间可以进行交互,对用户是否流失极为关键。

因此我们组最优先的目标是,让首屏最重要的内容尽快可视、可交互。

对应的指标

统计性能的指标有很多,其中最重要的有FMP(是否有内容可视)和 TII(是否可以交互)。

但因为FMP中M代表meaningful,通常需要自己去推算,在Chrome中已经使用LMP(最大的可视化的内容)替代。

如何统计

很多在线网站提供了统计数据,但此种数据成为实验室数据,我们通常期望收集到的真实用户的数据。

W3C 2012年制定的Navigation Timing标准,让我们可以在主流浏览器使用performance API获取各阶段的时间。

探查LCP

const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    console.log(entry);
  }
});
observer.observe({entryTypes: ['largest-contentful-paint', 'longtask']});

使用上述代码可以对LCP进行侦听,但是注意:在网页加载的不同阶段,最大的Content是会变的,因此可能输出多个entry的值。

针对LCP优化的目标尽可能减少LCP的时间。

结合数据上报,我们可以看到上面什么时间点,什么元素在页面已经是可视状态。

探查TTI

TTI在API层面并不支持,可以使用Chrome提供的tti-polyfill,在安装后,就可以在代码中使用如下代码来输出TTI:

import ttiPolyfill from 'tti-polyfill';

ttiPolyfill.getFirstConsistentlyInteractive().then((tti) => {
 console.log(tti);
});

针对TTI的优化目标是尽可能让它靠近LCP的值。

单个数据无意义

LCP和TTI的结果,通常会在不同用户、设备、时间上有不同的表现,单个数据值并不具备统计意义。

最好的做法是,结合数据上报,最终得到大量用户的数据,然后取中值。

在手机App上的秒开率,也是这么个思路,即1秒内内容交互的用户的占比。

关键渲染路径

CRP(关键渲染路径) 简单来说就是浏览器将HTML、CSS和JavaScript转化为可见的像素的过程。

有一个标准常被用来衡量CRP(关键渲染路径)的性能:

指标名 含义
CRP resourcs 请求资源的数量
CRP KB 请求资源的大小
CRP length 代表了从请求从客户端到服务端来回的次数(仅会阻塞渲染的资源)

客户端的优化策略

理解加载渲染过程

JS阻塞DOM解析,CSS阻塞样式的渲染,我们的目标是尽可能早地渲染render tree的内容。

浏览器会同时发起多个连接去加载CSS和资源,我们希望尽早看到界面样式,因此CSS加载应该放在头部,希望JS代码不要阻塞DOM的解析,因此通常将JS的引入在body标签结束之前的位置。

减少请求资源的数量

我们可以用如下手段来减少请求资源的数量:

  • <script>上使用defer/async
  • link上使用媒体查询
  • 使用内联的CSS、使用内联base64图片
  • 使用浏览器的强缓存

减小请求资源的大小

通过压缩、合并、混淆,都可以减少资源大小。

在Webepack使用了common trunk来提取公共代码、使用tree shaking将无用代码进行了剔除。

减少阻塞请求的来回次数

对于类似站点统计代码,并不需要阻塞网页加载,因此可以使用 async/defer。

字体文件、Sprite等方式都是将多个请求合并到了一个请求。

SSR则是将所需要的资源都打包到了一个HTML文件中,实现一步到位。

服务端/网络的优化

前节只是介绍了偏客户端优化的策略,我们还可以通过

  • CDN来优化加载资源的物理路径,从而实现更快的加载
  • 服务端进行资源缓存,协商缓存的策略减少数据库的查询
  • 服务端采用GZIP压缩,减少传输资源的大小
  • 将请求升级到HTTP2,HTTP2诞生的初衷就是为了提高传输效率低的问题

关于缓存,是网站性能优化的利器,需要浏览器和服务器配合决定,什么资源采取什么样的缓存策略。

比如,作为入口的HTML文件是禁止使用缓存的,每次都发请求到服务器。而对于其他资源,则使用Cache-Control做很长时间(比如1年)的缓存时间,每次变化后Webpack打包出来的资源都有的指纹并更新对应的HTML,也就确保每次访问的都是最新的资源。

下一步是什么

交互流畅

在用户能够很快打开网站以后,下一步就是如何让用户的交互过程尽可能流畅。

操作延时、动画卡顿 或 电脑开始轰鸣响起,通常说明发生了内存泄漏 或 执行了内存开销很大的任务。

前述performance API也有long task类型的可以对长任务进行侦听。

因此下一步是学习如何基于Chrome的Performance进行调试,并解决妨碍流畅的问题。

还需要学习什么代码将会导致内存泄漏、怎么书写能减少“重排”和“重绘”的频率。

这一切都离不开对开发工具的熟练使用 和 实践。

希望后续,自己还可以继续补充一些更具实际操作的做法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269