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
hbsnow
July 14, 2023
Programming
620
0
Share
巨大tableのパフォーマンスを改善する
https://anotherworks.connpass.com/event/285095/
hbsnow
July 14, 2023
More Decks by hbsnow
See All by hbsnow
フロントエンドエンジニアが顧客エンジニアとスクラムで伴走している話
hbsnow
0
180
お客さんのエンジニアとスクラムで 併走している話
hbsnow
0
150
Other Decks in Programming
See All in Programming
〜バイブコーディングを超えて〜 チームで実験し続けたAI駆動開発
tigertora7571
0
190
(Re)make Regexp in Ruby: Democratizing internals for the JIT
makenowjust
3
1k
Firefoxにコントリビューションして得られた学び
ken7253
2
160
ソフトウェア設計の結合バランス #phperkaigi
kajitack
0
490
when storing skills in S3 file
watany
3
1.4k
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
190
mruby on C#: From VM Implementation to Game Scripting (RubyKaigi 2026)
hadashia
2
1.6k
ローカルLLMでどこまでコードが書けるか / How much code can be written on a local LLM
kishida
2
320
過去のレビュー知見をSkillsで資産化した話
pkshadeck
PRO
1
1.6k
GitHubCopilotCLIをはじめよう.pdf
htkym
0
330
Spec-Driven Development with AI Agents (Workshop, May 2026)
antonarhipov
3
320
How We Practice Exploratory Testing in Iterative Development( #scrumniigata ) / 反復開発の中で、探索的テストをどう実施しているか
teyamagu
PRO
3
740
Featured
See All Featured
Embracing the Ebb and Flow
colly
88
5k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.8k
Building Adaptive Systems
keathley
44
3k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
550
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Utilizing Notion as your number one productivity tool
mfonobong
4
300
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
1.3k
Skip the Path - Find Your Career Trail
mkilby
1
120
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
200
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
280
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
70
39k
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] フロントエンドエンジニア募集中です!