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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
hbsnow
July 14, 2023
Programming
660
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
巨大tableのパフォーマンスを改善する
https://anotherworks.connpass.com/event/285095/
hbsnow
July 14, 2023
More Decks by hbsnow
See All by hbsnow
フロントエンドエンジニアが顧客エンジニアとスクラムで伴走している話
hbsnow
0
190
お客さんのエンジニアとスクラムで 併走している話
hbsnow
0
150
Other Decks in Programming
See All in Programming
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
150
Cloudflare is Agents
chimame
0
160
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
250
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
320
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
150
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
540
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.7k
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
190
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
210
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
4.3k
SlackアプリとLambdaの 連携を構築した話
pawn_4_s
1
110
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
220
Featured
See All Featured
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
640
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
Building AI with AI
inesmontani
PRO
1
1.1k
Embracing the Ebb and Flow
colly
88
5.1k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
990
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
410
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
The Cost Of JavaScript in 2023
addyosmani
55
10k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
440
Color Theory Basics | Prateek | Gurzu
gurzu
0
410
Tell your own story through comics
letsgokoyo
1
1k
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] フロントエンドエンジニア募集中です!