Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
巨大tableのパフォーマンスを改善する
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
hbsnow
July 14, 2023
Programming
0
600
巨大tableのパフォーマンスを改善する
https://anotherworks.connpass.com/event/285095/
hbsnow
July 14, 2023
Tweet
Share
More Decks by hbsnow
See All by hbsnow
フロントエンドエンジニアが顧客エンジニアとスクラムで伴走している話
hbsnow
0
180
お客さんのエンジニアとスクラムで 併走している話
hbsnow
0
140
Other Decks in Programming
See All in Programming
Feature Toggle は捨てやすく使おう
gennei
0
380
Java 21/25 Virtual Threads 소개
debop
0
300
Smarter Angular mit Transformers.js & Prompt API
christianliebel
PRO
1
100
おれのAgentic Coding 2026/03
tsukasagr
1
120
20260320登壇資料
pharct
0
130
Nuxt Server Components
wattanx
0
160
仕様漏れ実装漏れをなくすトレーサビリティAI基盤のご紹介
orgachem
PRO
7
3.4k
Cyrius ーLinux非依存にコンテナをネイティブ実行する専用OSー
n4mlz
0
260
Codexに役割を持たせる 他のAIエージェントと組み合わせる実務Tips
o8n
4
1.4k
Fundamentals of Software Engineering In the Age of AI
therealdanvega
2
300
ファインチューニングせずメインコンペを解く方法
pokutuna
0
210
Linux Kernelの1文字のミスで 権限昇格ができた話
rqda
0
2.2k
Featured
See All Featured
Docker and Python
trallard
47
3.8k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.2k
Evolving SEO for Evolving Search Engines
ryanjones
0
170
The agentic SEO stack - context over prompts
schlessera
0
720
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Writing Fast Ruby
sferik
630
63k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
990
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
680
Google's AI Overviews - The New Search
badams
0
950
Practical Orchestrator
shlominoach
191
11k
My Coaching Mixtape
mlcsv
0
87
Done Done
chrislema
186
16k
Transcript
巨大tableのパフォーマンスを改善する 1 クラスメソッド株式会社 高橋ゆうき 2023.06.22 Front-End Deep Dive
2 自己紹介 高橋ゆうき クラスメソッド株式会社 CX事業本部Delivery部 フロントエンドチーム チームリーダー @hbsnow
3 ある日、POに言われた ページの切替時に表示が 遅いんだけど なんとかなりませんか?
4 そこには巨大なテーブルがあった • よく使われるページのテーブルはデフォルト状態だと だいたい行100*列20 ◦ 行数はPagerで設定をかなり大きな数値に変更 ◦ 列は設定で最大130近くになる
5 指摘された問題はAPIのせいではない • このプロジェクトではページ切替時、切り替えた先の ページを一度でも開いていればリクエストを再取得し ていない • 今回指摘されたのはこのときの切替時、なぜAPIのリク エストがないのに表示に時間がかかるのかという点 ※これは参考なので
あくまでこんな感じというイメージです
6 windowing / 仮想スクロール の話でしょ? react-virtuoso react-window react-table + react-virtual
7 違うんです…… react-virtuoso react-window react-table + react-virtual
8 テーブルが複雑すぎて • 開発開始から3年の月日が経っているため、テーブルが 多くの複雑な機能を持っていて厳しかった…… ◦ 列のD&D ◦ 列・行のフィルター・検索機能 ◦
列の一時非表示機能 ◦ 行ソート ◦ 展開行 ◦ チェックボックスでの行絞り込み ◦ タグでの行絞り込み ◦ お気に入り など、さらに日々機能も追加される
9 requestIdleCallbackを使ってみる • 表示したい要素をchunk • requestIdleCallbackでCPUに余裕があるときに順次表 示するようにするDeferコンポーネントを作った 参考: Improving slow
mounts in React apps https://itnext.io/improving-slow-mounts-in-react-apps-cff5117696dc
10 サンプルで作ったのはこんなテーブル
11 サンプルはこちら https://hbsnow-sandbox.github.io /react-heavy-table/ サイト コード https://github.com/hbsnow-sandbox /react-heavy-table
12 before - Lighthouse
13 before - Performance
14 requestIdleCallback: after - Lighthouse
15 requestIdleCallback: after - Performance
16 requestIdleCallbackをつかったDeferコンポーネントの問題点 • 結局処理に時間がかかっていることには変わらないの で、微妙なスペックのPCだとtimeoutの時間をいくら 長くしたところで処理が終わらなくなってくる • 小刻みに行が増えていくので、セルの幅が突然変化す ることがある(幅を固定できるなら問題にならない)
17 メリットもあります • 導入コストが圧倒的に低い
18 ある日、POに言われた Part2 今度の新規ページのテーブル は3000行くらいで、Pagerは なしでお願いします
19 そもそも初期表示ですべて表示する必要はないのでは? • 数値Min-MAXでのフィルター • 文字列検索機能 • チェックボックスでのフィルター • タグでのフィルター
20 なら素直にIntersectionObserverで良かった • 表示したい要素をchunk • IntersectionObserverで最下部まで到達したら以降の コンテンツを読み込む
21 IntersectionObserver: Lighthouse
22 IntersectionObserver: Performance
23 だいぶ良くなったのでこれで終わり……? Pagerを作り、1ページにつき500件を表示してみる。 このときにnextを二回押すとどうなるか
24 Page1がスキップされる Page: 1 の表示は完全にスキップされて Page: 2 が表示される 表示に時間がかかる場合、UIがブロックされてユーザーは自分が いまどういう状況なのかわかりにくい
25 つまりUIをブロックせずに状態を更新したい useTransition
26 処理中であることをわかりやすく ついでにisPending中にLoaderを出しました
27 まとめ • 最初に思い浮かんだ方法が唯一の解決方法ではないかも しれません • 顧客が本当に解決したい課題は何かをヒアリングして、 実装方法に問題ないか確認する • requestIdleCallback・IntersectionObserverは便利
◦ 今回話にだしていませんが、requestIdleCallbackは polyfillが必要なので注意してください • UIがブロックされるとき、useTransitionが使えるかもし れません
28 おわり ありがとうございました [ad] 7/7・7/8 DevelopersIO 2023 もよろしくお願いします! [ad] フロントエンドエンジニア募集中です!