性能优化

准备:计划和度量

  • 建立性能优化文化
  • 比竞品快 20%
  • 选择正确的度量标准
    尽快的渲染重要的像素和反馈输入;优先考虑页面加载,因为它直接被用户感知;交互反应时间、首次输入延迟、Hero Rendering Times、Largest Contentful Paint、Total Blocking Time and Cumulative Layout Shift 通常比较重要;不包括:First Meaningful Paint.
  • 清空后台并且以用户角色进行测试
  • 与同事共享 checklist

设置实际的目标

  • 100 毫秒响应时间,60 帧每秒
  • LCP < 2.5s, FID < 100ms, CLS < 0.1, Time To Interactive < 5s on 3G
  • 控制文件大小 < 170k

定义环境

  • 选择打包工具

  • 渐进的提高用户体验

  • 选择一个有力的性能基准
    js 有昂贵的体验代价,170kb 的文件已经包含关键的 HTML/CSS/Javascript,路由,状态管理,工具函数,框架,业务逻辑;彻底检查网络传输时间,转义/编译时间和框架运行时消耗的时间

  • 评估每个框架和依赖

  • 选择框架:React, Vue, Angular, Ember and Co.
    确保选择的框架有服务端渲染,预渲染能力。测试服务端启动时间和在移动设备上的客户端渲染模式;了解框架的核心和机制,了解 PRPL pattern 和 app shell architecture。推荐选择:Preact,inferno,vue,svelte,Alpine,Polymer

  • 优化 API 性能
    考虑使用 GraphQL

  • 选择 CDN
    分离静态内容,放在 CDN ;检查CDN 的压缩和转化效率

优化打包之后的资源

  • 使用 Brotli 压缩纯文本
  • 使用响应式图片 AVIF 和 WebP
  • 图片是否被优化了?
    使用 mozJPEG 压缩 JPEG,SVGO 压缩 SVG,Pingo 压缩 PNGs;或者使用 Squoosh
  • 视频是否被优化了?
  • 字体是否被优化了?

优化构建

  • 设置优先级
    列一个资源清单(js,images,fonts,第三方脚本,“昂贵”的模块)并分组;定义基本体验(需要兼容低版本的浏览器),提升体验(现代浏览器丰富的体验)和扩展(不是必须的资源可以被懒加载)
  • 在生产环境使用 js 原生模块
    使用 ES 2017 的 type=“module” 属性,现代浏览器可以分模块加载js
  • 加速初始渲染时间
    progressive hydration and import on interaction
  • 使用 tree-shaking,scope hoisting 和 code-spliting 减少 请求的资源
    tree-shaking 在打包过程中去掉在生产环境中没有使用到的代码;code-spliting 将代码分离到不同的块中,然后可以按需加载;Scope hoisting 检测导入链是否可以被扁平化,并在不有损代码的清空下转化为内联函数;使用颗粒化的代码块 chunk 将一些客户端的渲染移到服务端;通过追踪 css/js 代码块的使用,找到分割代码的点
  • 是否能将 JavaScript 移到 Web Worker 或者 WebAssembly 中运行?
  • 定位和移除没有用到的 css/JavaScript
  • 减小js依赖的大小
    webpack-libs-optimizations 移除在构建过程中没有使用到的方法;Bundlephobia 帮助发现添加一个包所花费的构建时间;size-limit 添加检查 JavaScript 运行时间;Skypack 发现社区挑选的包
  • 预请求 JavaScript 代码块
    Guess.js 使用 Google Analytics data 发现用户最可能访问的下一个页面
  • 为目标 JavaScript 引擎优化
    为巨石应用使用 script streaming,因此当脚本下载时,可以被后台线程转译

加载资源优化

  • 异步加载 JavaScript
    更推荐使用 defer 而不是 async
  • 使用 IntersectionObserver 懒加载消耗高的组件
  • 延迟渲染和解码图片
    content-visible 属性和 <img decoding=“async”>
  • 尽快推送关键的 css
    将关键的 css 放在 head 标签内(大小在 14kb 以下)
  • Stream responses
  • 优化渲染性能
    如果需要,可以使用细粒度的CSS封装来隔离昂贵的组件。确保在滚动页面或动画元素时没有延迟,并且始终达到每秒60帧。如果这是不可能的,那么让每秒帧数保持一致至少比60到15的混合范围更好。使用CSS will-change通知浏览器哪些元素将发生变化。
  • 减少重排合重绘

网络合 HTTP/2

分类

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

推荐阅读更多精彩内容