反応ウィンドウでグリップを取得する
フロントエンド開発コミュニティでは、performance
という言葉をよく使用する傾向があります。 私たちは皆、パフォーマンスの高いアプリケーションを持つという共通の目標を持っています。 ブライアン・ヴォーンはこれを念頭に置いてreact-window
を開発し、この目標を達成するための強力なツールを提供してくれました。
反応ウィンドウの背後にある理論
react-window
は理論的には非常に理解しやすく、ウィンドウはユーザーが見ることができるビューを指します。
react-window
は、ユーザーが見ることができるものだけをレンダリングします。なぜ、ユーザーが見ることができない領域をレンダリングするリソースをわざわざ使用するのでしょうか。 それは純粋な愚かさです!
実用的になりましょう
実際のアプリケーションがなければ、アプリケーションのプロファイルを作成するのは非常に難しいのではないでしょうか。 映画の大規模なリストを取得するアプリケーションを作成しました。ここでリポジトリを確認できます。
npm install
を実行してからnpm start
を実行すると、localhost:3000
に次のように表示されます。
初期測定
movie-list.js
の次のコードは、大きな応答から5000
の映画を取得します。
const moviesList = movies.slice(0, 5000);
サンプルサイズとして5000
を使用します。これは非常に分厚いため、レンダリングに時間がかかるためです。
最初のパフォーマンスを測定することから始めます。最初に測定するのは、1秒あたりのフレーム数(FPS
)です。 Chrome DevToolsでこれを有効にするには、他のツールをクリックしてからレンダリングすることにより、レンダリングをオンにする必要があります。
私たちのFrame Rate
は34.0 fps
にあり、かなり遅いので、60fps
の周りで何かを達成することをもっと探しています。
次に測定するのはFirst Meaningful Paint
です。 これを行うために、Lighthouseレポートを実行しましたが、これは5000
ムービーを処理できなかったため、このテストのために、ムービーの数を500
に移動しました。
上記からわかるように、パフォーマンスは良くありません。これは5000
ではなく、500
ムービーの場合であることを覚えておいてください。
反応ウィンドウの実装
performance-increased
という新しいブランチですべてのパフォーマンスのアップグレードを行います。つまり、リポジトリのクローンを作成すると、master
ブランチで低速のアプリケーションが作成され、両方を切り替えて表示できます。違い。
react-window
を実装するには、最初にnpm install react-window
を実行してインストールし、次にFixedSizeList
をインポートする必要があります。
import { FixedSizeList as List } from 'react-window';
行の作成
List
コンポーネントを操作するには、次のようにRow
コンポーネントを作成する必要があります。
// all props are passed by the List component const Row = ({ index, style, data }) => { const movie = data[index]; // style is passed by the List component to give our Row the correct dimensions return ( <div style={style} key={index}> <Movie key={index} {...movie} /> </div> ); };
Movie
コンポーネントは問題ではないため、ここでは説明しません。基本的には、各ムービーのビューです。
AutoSizerコンポーネント
Row
コンポーネントを作成したら、List
コンポーネントを実装してAutoSizer
コンポーネントにラップします。
<AutoSizer> {({ height, width }) => ( <List className="List" height={height} itemCount={1000} itemSize={150} width={width} itemData={moviesList} > {Row} </List> )} </AutoSizer>
AutoSizer
コンポーネントは、height
およびwidth
をList
コンポーネントに渡すことにより、Row
コンポーネントの寸法をコンテナに自動的にスケーリングします。 静的な値をheight
およびwidth
プロップに渡すこともできます。
AutoSizer
をインストールするには、npm install react-virtualized-auto-sizer
を実行してから、以下をインポートします。
import AutoSizer from 'react-virtualized-auto-sizer';
リストコンポーネント
List
コンポーネントは非常にシンプルです。ご覧のとおり、itemData
という小道具があり、すべての5000
ムービーを渡します。これにより、 Row
コンポーネント。
const movie = data[index];
itemSize
プロップは、各行の高さです。 残りの小道具は非常にシンプルです。
Listコンポーネントは、デフォルトでstyle
およびindex
プロップをRow
コンポーネントに渡します
これですべてが整ったので、FPS
メーターをチェックしてみましょう。 今回は、60fps
という目標にはるかに近づいています。
リポジトリのクローンを作成して2つのブランチを比較した場合は、最初のレンダリングがどれだけ速いかもわかります。 これを証明するために、別の監査を実行してみましょう。
最初はパフォーマンスで63
を獲得しましたが、現在は100
を獲得しています。 First Meaningful Paint
は、react-window
なしの4.8s
と比較して、1.1s
のみを使用しました。 また、この監査は、最初の監査が実行された500
ではなく、5000
ムービーに対して実行されたことを忘れないでください。
まとめ
上記から、react-window
がいかに強力であるかがわかります。 私たちのアプリケーションは非常に単純なものでしたが、それでもパフォーマンスに大きなメリットがあります。 この記事から何かを学び、パフォーマンス目標の達成に近づいていることを願っています。