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

news/2024/7/10 2:52:58 标签: java, vue, python, js, html
htmledit_views">
html" title=js>js_content">

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

6dd1ad7b45a81ddb8e6fc42591689b48.png

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

364e6a49873793d811481d3f8da38f11.png
左Vue,右React

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

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

f9af241c49c5f5d4d133acf385eaf972.png

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

优化效果

经过优化后的lightHouse跑分:

af0030de20f195e4bb2fb2bfe932f87c.png

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

e86746946e7cfb66c6c4e59915c85685.png

两者10次TTI跑分对比:

46754d827f30c925def4463124b0ee03.png

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

  • 页面展示了「有用信息」(由FCP衡量,FCP指First Contentful Paint)

  • 可见页面中大部分元素完成事件绑定,交互响应的延迟在50ms内

优化措施

优化主要有两个思路:

  • 编译时:减少打包体积

  • 运行时:「非首屏必需」代码延迟加载

编译时优化

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

f9a91860aa5c3b49af70aac3e0e8d4be.png

再比如:

c21859a786e9d7e37fdfaf7e78e3164f.png

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

e5ddaaa412f39bf6221a8806a669eb93.png

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

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

df6776e97cb57e62c13907e8a50ae3a5.png

运行时优化

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

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

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

27d6fec836b66b990d36db8863cfcebb.png

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

11941bb6f8dcbf3da62d248894724e33.png
左之前,右之后

TBT[2]Total Blocking Time,即总阻塞时间)测量页面「被阻止响应用户输入(例如鼠标点击、屏幕点击或按下键盘)的总时间」

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

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

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

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

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

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

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

454535f4fb8841b634e0f831d9de51ba.png

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

29378705441e4dab2081d138444c1829.png

总结

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

b47fb38ed7cba8159ac06efe2724481a.png

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

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

参考资料

[1]

TTI: https://web.dev/tti/

[2]

TBT: https://web.dev/tbt/

[3]

INP: https://web.dev/inp/

[4]

参与讨论: https://github.com/reacthtml" title=js>js/reacthtml" title=js>js.org/issues/4691

彦祖,亦菲,点个「在看」


http://www.niftyadmin.cn/n/1250875.html

相关文章

实体类转换DTO的方式

背景&#xff1a;在对外传输数据展示过程中&#xff0c;为了避免model层直接对外暴露&#xff0c;我们会多加一个对应的DTO保理想要传输的数据即可&#xff0c;隐藏model层。 应对&#xff1a; 1.第一种&#xff0c;如果是实体类字段类型都一样&#xff0c;大部分会采用bean拷…

java中new与static分析

抱怨java的new浪费了太多的内存&#xff0c;应该大量的使用static 前半句在某些情况下正确&#xff0c;后半句绝对错误。 说这话的是完全不懂对象&#xff0c;完全没有OO基础知识&#xff0c;但是这些人还在从事Java/.NET等OO软件开发&#xff0c;相当于外行人冒充内行&#xf…

为什么说移动端该放弃rem适配方案了?

作者&#xff1a;去伪存真https://juejin.cn/post/70849266460330557521.背景在做移动端各种尺寸屏幕的适配时&#xff0c;用的最多的就是rem方案。我们都写过这样的代码,来设置根字体大小。这个计算公式中设备宽度&#xff0c;UI设计稿尺寸这两个参数比较好理解&#xff0c;可…

如何使用 IntelliJ IDEA中配置PHP开发环境 及项目搭建

首先我们这里使用WANPServer WampServer是一款由法国人开发的Apache Web服务器、PHP解释器以及MySQL数据库的整合软件包。免去了开发人员将时间花费在繁琐的配置环境过程&#xff0c;从而腾出更多精力去做开发。 WampServer就是Windows Apache Mysql PHP集成安装环境&#xf…

过度使用懒加载的弊端

懒加载的过度使用会给应用性能带来负面影响。所以在这篇文章中&#xff0c;会详述懒加载对性能的影响&#xff0c;来帮助你理解应该何时使用它。什么是懒加载&#xff1f;懒加载是一种常见的技术&#xff0c;通过按需加载资源来减少网页的数据使用。如今懒加载已经是一种 Web 标…

IntelliJ IDEA中用谷歌浏览器打开页面,出现windows 找不到文件chrome

1.右击谷歌浏览器快捷方式打开文件位置。如&#xff1a; 2. 打开IntelliJ IDEA软件&#xff0c;找到file–>settings–>找到Web Browsers。 3.在chrome那一栏最右边的path中选择chrome.exe文件就可以了 4、点击应用和保存,然后再次点击chrome按钮&#xff0c;就可以啦&…

现在面试都问什么「字节、蚂蚁、美团、滴滴面试小记」

写在前面笔者三年工作经验&#xff0c;平时工作上也会技术面试一些候选人&#xff0c;听江湖上传闻三年是个坎&#xff0c;目前刚好也有三年没有出来面试了&#xff0c;想出来考验考验自身功底如何&#xff1f;&#x1f643;主要投递了一些可视化与基础设施建设相关方向的职位&…

java学习之静态代理

一、概述 代理是一种模式&#xff0c;提供了对目标对象的间接访问方式&#xff0c;即通过代理访问目标对象。如此便于在目标实现的基础上增加额外的功能操作&#xff0c;前拦截&#xff0c;后拦截等&#xff0c;以满足自身的业务需求&#xff0c;同时代理模式便于扩展目标对象…