头图

被diss性能差,Dan连夜优化React新文档

大家好,我卡颂。

昨天在开源圈发生个小插曲。起因是有个用户表示:React新文档在文档结构、美观度、性能等各方面都达到很高的标准。

尤雨溪对Vue新文档与React Beta文档做了测试后表示:在性能这块,Vue新文档更具优势。

左Vue,右React

Dan表示:当前文档还处于Beta版本,现在有更重要的工作要完成,正式版上线前会优化性能。

话虽这么说,Dan应该是通了个宵优化了一把性能:

本篇文章我们来看看,Dan都做了哪些优化。

欢迎加入人类高质量前端框架群,带飞

优化效果

经过优化后的lightHouse跑分:

作为对照,Vue文档的跑分:

两者10次TTI跑分对比:

这里的TTI(Time to Interactive,即可交互时间),衡量的是页面变得完全可交互所需时间,其中完全可交互指:

  • 页面展示了有用信息(由FCP衡量,FCP指First Contentful Paint)
  • 可见页面中大部分元素完成事件绑定,交互响应的延迟在50ms内

优化措施

优化主要有两个思路:

  • 编译时:减少打包体积
  • 运行时:非首屏必需代码延迟加载

编译时优化

之前入口处全量引入了一个工具函数utils,现在将其中方法拆分成不同文件,这样能减少首屏bundle体积:

再比如:

这部分优化让bundle体积减少约一半:

其次,当前Next.js(文档使用的框架)没有默认开启针对现代浏览器编译。这意味着bundle中会引入更多polyfill,有更多语法转换及帮助函数。

Dan通过配置开启了这个功能:

运行时优化

运行时优化的方式主要是:懒加载非必需资源。

新文档中存在很多codesandbox(在线示例),这些示例依赖CodeMirror linter,但这不是首屏必需的。

所以Dan将这部分资源懒加载:

除此之外,如果你细心观察会发现,Total Blocking Time指标下降很多:

左之前,右之后

TBTTotal Blocking Time,即总阻塞时间)测量页面First Contentful Paint 首次内容绘制 (FCP)Time to Interactive 可交互时间 (TTI)之间的总时间。。

一般来说,如果JS执行时间过长,就会影响这个指标。

我们知道,页面加载后前端框架会有首屏渲染的初始化过程。即使是服务端渲染,也会有Hydrate(注水)的过程。

React18Selective Hydration为解决这一问题提供了好方法。

如果你的React18应用是SSR,那么被<Suspense/>包裹的组件部分不会参与首次Hydrate的过程。

也就是说,被<Suspense/>包裹的部分不会影响阻塞时间。

所以,虽然这部分工作很重要,但Dan需要做的,仅仅是把一些对首屏显示不太重要的组件包裹在<Suspense/>中。

可以看到,在将一些组件用<Suspense/>包裹前Hydrate作为一个长任务的耗时:

当包裹之后,这个长任务持续时间显著降低,进而降低TBT

总结

这些只是初步的优化结果,后续还有很多优化工作值得去做。比如INP(Interaction to Next Paint,与下一次Paint的交互)指标还是偏高:

Dan坦言:指标偏高的原因可能是因为 —— React本身比较慢。

他对此提出了一些猜想,你可以到这里参与讨论

avatar
卡颂
《React技术揭秘》作者
2.6k 声望
16.6k 粉丝
0 条评论
推荐阅读
预测2024年之后的前端开发模式
最近AIGC(AI Generated Content,利用AI生成内容)非常热,技术圈也受到了很大冲击。目前来看,利用LLM(Large Language Model,大语言模型)辅助开发还停留在非常早期的阶段,主要应用是辅助编码,即用自然语言...

卡颂2

封面图
手把手教你写一份优质的前端技术简历
不知不觉一年一度的秋招又来了,你收获了哪些大厂的面试邀约,又拿了多少offer呢?你身边是不是有挺多人技术比你差,但是却拿到了很多大厂的offer呢?其实,要想面试拿offer,首先要过得了简历那一关。如果一份简...

tonychen153阅读 17.9k评论 5

封面图
正则表达式实例
收集在业务中经常使用的正则表达式实例,方便以后进行查找,减少工作量。常用正则表达式实例1. 校验基本日期格式 {代码...} {代码...} 2. 校验密码强度密码的强度必须是包含大小写字母和数字的组合,不能使用特殊...

寒青57阅读 8.6k评论 11

JavaScript有用的代码片段和trick
平时工作过程中可以用到的实用代码集棉。判断对象否为空 {代码...} 浮点数取整 {代码...} 注意:前三种方法只适用于32个位整数,对于负数的处理上和Math.floor是不同的。 {代码...} 生成6位数字验证码 {代码...} ...

jenemy49阅读 7.3k评论 12

再也不学AJAX了!(二)使用AJAX ① XMLHttpRequest
「再也不学 AJAX 了」是一个以 AJAX 为主题的系列文章,希望读者通过阅读本系列文章,能够对 AJAX 技术有更加深入的认识和理解,从此能够再也不用专门学习 AJAX。本篇文章为该系列的第二篇,最近更新于 2023 年 1...

libinfs42阅读 7k评论 12

封面图
CSS 绘制一只思否猫
欢迎关注我的公众号:前端侦探练习 CSS 有一个比较有趣的方式,就是发挥想象,绘制各式各样的图案,比如来绘制一只思否猫?思否猫,SegmentFault 思否的吉祥物,是一只独一无二、特立独行、热爱自由的(&gt;^ω^&lt...

XboxYan48阅读 3.3k评论 14

封面图
「多图预警」完美实现一个@功能
一天产品大大向 boss 汇报完研发成果和产品业绩产出,若有所思的走出来,劲直向我走过来,嘴角微微上扬。产品大大:boss 对我们的研发成果挺满意的,balabala...(内心 OS:不听,讲重点)产品大大:咱们的客服 I...

wuwhs32阅读 3.5k评论 5

封面图
avatar
卡颂
《React技术揭秘》作者
2.6k 声望
16.6k 粉丝
宣传栏