在前端开发社区中,我们倾向于使用性能
这个词,我们都有一个共同的目标,即拥有一个高性能的应用程序。
反应窗口背后的理论
反应窗口
在理论上是非常简单的理解,窗口是指用户可以看到的视图。
反應窗口
只會顯示使用者可以看到的東西,因為為什麼我們要使用資源顯示使用者看不到的區域?這將是純粹的愚蠢!
让我们务实
好吧,如果没有实际应用程序,将应用程序配置起来会很困难吗?我已经创建了一个应用程序,收集了大量的电影清单, 你可以在这里查看复制片。
只需运行npm安装
,然后npm启动
,您现在应该在localhost:3000
上看到以下内容
初步测量
movie-list.js
中的以下代码将从我们的大响应中获得5000
电影:
1const moviesList = movies.slice(0, 5000);
我们将使用5000
作为我们的样本大小,因为它很小,需要一些时间来渲染。
我们将通过测量我们的初始性能开始,我们首先测量的是我们每秒的(‘FPS’)。
我们的Frame Rate
是34.0fps
,这是相当缓慢的,我们更希望实现60fps
左右的东西。
接下来我们将测量的是我们的第一个有意义的油漆
。为了做到这一点,我运行了一份灯塔报告,这不能处理5000
电影,所以只是为了这个测试,我把电影的数量转移到500
正如你从上面可以看到的那样,表现并不好,请记住,这与500
电影有关,而不是5000
。
应用 React-Window
我将对一个名为性能增强
的新分支进行所有性能升级,这意味着当你克隆复制器时,你将对主
分支进行缓慢的应用,你可以切换两者之间看到差异。
要实现react-window
,您需要先通过运行npm install react-window
来安装它,然后导入FixedSizeList
。
1import { FixedSizeList as List } from 'react-window';
创建一个线
要使用列表
组件,我们需要创建这样的原始
组件:
1// all props are passed by the List component
2const Row = ({ index, style, data }) => {
3 const movie = data[index];
4 // style is passed by the List component to give our Row the correct dimensions
5 return (
6 <div style={style} key={index}>
7 <Movie key={index} {...movie} />
8 </div>
9 );
10};
我们不会进入电影
组成部分,因为这并不重要,基本上这就是我们对每部电影的看法。
汽车组件
随着我们的原始
组件的创建,我们可以实施我们的列表
组件,我们将其包装成一个AutoSizer
组件:
1<AutoSizer>
2 {({ height, width }) => (
3 <List
4 className="List"
5 height={height}
6 itemCount={1000}
7 itemSize={150}
8 width={width}
9 itemData={moviesList}
10 >
11 {Row}
12 </List>
13 )}
14</AutoSizer>
AutoSizer
组件将自动将我们的Row
组件的尺寸扩展到其容器,通过将高度
和宽度
传递给我们的列表
组件。
要安装AutoSizer
,运行npm install react-virtualized-auto-sizer
,然后导入:
1import AutoSizer from 'react-virtualized-auto-sizer';
列表组件
列表
组件非常简单,正如你可以看到的,我们有一个名为itemData
的插件,我们通过我们的所有5000
电影,这让我们可以在我们的原始
组件中访问一个单独的电影。
1const movie = data[index];
itemSize
是每个行的高度,其余的是相当简单的。
<$>[注] 列表组件默认情况下将风格
和索引
插件传递给我们的原始
组件 <$>
现在一切都好了,让我们看看我们的FPS
计数器,这次它更接近我们的60fps
目标。
如果你克隆了复制品,并比较了这两个分支,你也会看到初始渲染速度有多快。
起初,我们在我们的表演中得到了63
,但现在我们得到了100
。我们的第一个有意义的绘画
只有1.1s
,而不是4.8s
没有反响窗口
。
包装上
您可以从上面看到反应窗口
有多强大。我们的应用程序非常简单,但我们仍然可以看到伟大的性能效益。