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
歴代のWeb Speed Hackathonの出題から考えるデグレしないパフォーマンス改善
Search
did0es
August 20, 2025
Technology
8
720
歴代のWeb Speed Hackathonの出題から考えるデグレしないパフォーマンス改善
Browser and UI #3の登壇資料です。
スライド内のリンクは、
Googleスライド版
をご覧ください。
did0es
August 20, 2025
Tweet
Share
More Decks by did0es
See All by did0es
ViteとTypeScriptのProject Referencesで 大規模モノレポのUIカタログのリリースサイクルを高速化する
shuta13
3
270
なぜクラウドサービスで Web コンソールを提供するのか
shuta13
4
2.4k
5分でわかるPreactのVDOMで作るWebエディタ
shuta13
0
210
TailwindCSSでUIライブラリを作る際のハマりどころ
shuta13
0
720
codemodとうまく付き合うには
shuta13
0
2.7k
プライベートクラウドのコンソール画面をNext.jsのApp Routerでフルリプレイスした話
shuta13
4
960
CyberAgent Developer Conference(CADC) 2023 LP開発の舞台裏
shuta13
0
260
Turborepo Code Generationによる、サイバーエージェントグループのフロントエンド開発の効率化
shuta13
4
2.7k
CADC 2023 LPにおけるライブ配信の裏側 | Momento Meetup #3
shuta13
0
180
Other Decks in Technology
See All in Technology
[CV勉強会@関東 ICCV2025] WoTE: End-to-End Driving with Online Trajectory Evaluation via BEV World Model
shinkyoto
0
290
国産クラウドを支える設計とチームの変遷 “技術・組織・ミッション”
kazeburo
4
5.8k
マルチドライブアーキテクチャ: 複数の駆動力でプロダクトを前進させる
knih
0
6.8k
JavaScript パーサーに using 対応をする過程で与えたエコシステムへの影響
baseballyama
1
110
Building AI Applications with Java, LLMs, and Spring AI
thomasvitale
1
220
未回答質問の回答一覧 / 開発をリードする品質保証 QAエンジニアと開発者の未来を考える-Findy Online Conference -
findy_eventslides
0
350
TypeScript 6.0で非推奨化されるオプションたち
uhyo
12
3.2k
OSだってコンテナしたい❗Image Modeが切り拓くLinux OS運用の新時代
tsukaman
0
110
技術広報のOKRで生み出す 開発組織への価値 〜 カンファレンス協賛を通して育む学びの文化 〜 / Creating Value for Development Organisations Through Technical Communications OKRs — Nurturing a Culture of Learning Through Conference Sponsorship —
pauli
5
490
AWS re:Invent 2025 で頻出の 生成 AI サービスをおさらい
komakichi
2
170
ABEJA FIRST GUIDE for Software Engineers
abeja
0
3.2k
組織の“見えない壁”を越えよ!エンタープライズシフトに必須な3つのPMの「在り方」変革 #pmconf2025
masakazu178
1
590
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.1k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.3k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
Become a Pro
speakerdeck
PRO
29
5.6k
Why You Should Never Use an ORM
jnunemaker
PRO
60
9.6k
The Pragmatic Product Professional
lauravandoore
36
7k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
2.9k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.3k
Embracing the Ebb and Flow
colly
88
4.9k
Transcript
歴代のWeb Speed Hackathonの 出題から考える デグレしないパフォーマンス改善 2025/08/20 did0es
Hirai Shuta | did0es(🗣 ディドス) SWE, Next Experts(TypeScript)@CyberAgent, Inc. Lead
organizer FEC Tokyo, Meguro.es For more: did0.es
Web Speed Hackathon(WSH)の概要 • ⾮常に重たい Web アプリをチューニングして、いかに⾼速にするかを競う 競技 ◦ WebサーバーとAPIサーバーの両⽅の実装を改善
• 詳細 ◦ 採点:提出されたURLに対して、GHAでLighthouseを動かして計測 ◦ 期間:2⽇間 • 過去のお題 ◦ 2025:架空の動画配信サービス「AREMA」 ◦ 2024:架空の漫画サイト「Cyber TOON」(did0esが作問を⼀部担当) ◦ 2023:架空のショッピングサイト「買えるオーガニック」 ◦ 2022:架空のベッティングサービス「CyberTicket」 ◦ 2021:架空のSNSサイト「CAwitter」 ◦ 2020:架空のブログサイト「Amida Blog(あみぶろ)」
レギュレーション • 競技を進める上での公平性の担保のほか、以下が定められている ◦ 許可⭕ ▪ リポジトリのコードやファイルは全て変更して良い ▪ 外部のサービス(SaaSなど)は⾃由に利⽤して良い ◦
禁⽌❌ ▪ Google Chrome最新版で著しい機能落ちやデザイン差異を発⽣させる ▪ 悪意を持ってVRTと⼿動テストを通過させるためのコードを書く
レギュレーションチェックマジック(?) • 最終のレギュレーションチェックで順位がガラッと⼊れ替わる ◦ 上位勢がごっそりリーダーボードから消える現象がまあまあある ◦ 2023〜2025の間に開催された3回の競技で、毎回上位から10名ほどが脱落 ▪ did0esは2021年度の競技で5〜7位ぐらいから2位まで上がった🥈 •
原因として多いもの ◦ 採点のVRTが落ちる(UI崩れ) ◦ ⼀部ページが開けない
WSHはデグレに厳しい👺
でも実際のサービスでデグレったら...😰
歴代のWeb Speed Hackathonの 出題から考える デグレしないパフォーマンス改善
推測より計測、だが... • そもそも重すぎて計測できない ◦ 計測ツールがタイムアウト ◦ 計測完了が超遅い ◦ 競技の性質上、これの待ちに時間を割けない ▪
実際の業務でもあまり時間をここに割きたくない ◦ 測れないと着⼿が難しい箇所も
まずはUI以外で⼿を加えれば確実に 改善につながる箇所を探す
UI以外で⼿を加えれば確実に改善につながる箇所の例 • ビルドツールの設定ミス ◦ 開発向けの設定で本番に出している ◦ サポート外のブラウザもサポートしようとしている • 重いパッケージを使っている ◦
Polyfillや富豪的にリソースを使うパッケージが散在 • ブラウザのレンダリング遅延 ◦ ⼤量 or 重い同期的な処理 ◦ シーケンシャルなAPIコール • 応答が遅いAPI ◦ GraphQLのN+1 ◦ スロークエリ
ビルドツールの設定ミス:2020年 • Webpack関連 ◦ source mapsやmodeなどを本番向けに変える • Babel関連 ◦ サポート外のブラウザ向けにトランスパイルしない
• PostCSS関連 ◦ 不要なCSSをパージする 参考 :https://github.com/CyberAgentHack/web-speed-hackathon-2020/wiki/Web-Speed-Hackatho n-Online-%E5%87%BA%E9%A1%8C%E3%81%AE%E3%81%AD%E3%82%89%E3%81%84%E3 %81%A8%E8%A7%A3%E8%AA%AC
重いパッケージを使っている:2022年 • Bundle Analyzerやnpm lsなどでサイズを測って⼤きいものから剥がす • 以下2022年度に⽤いられた中で代表的なもの ◦ Polyfill系 ▪
core-jsなどでサポート外のブラウザ向けのものは消す ◦ momentjs ▪ date-fnsやdayjsなど、軽量なものに変える ◦ lodash ▪ lodash-esや⽣JSに変える(You-Dont-Need-Lodash-Underscore) ◦ zengin-code ▪ バックエンドに持っていくか、Webpackでチャンク分割して遅延ロード ◦ axios ▪ Fetch APIに変える 参考:https://developers.cyberagent.co.jp/blog/archives/40123/
ブラウザのレンダリング遅延:2021, 2023年 • <script>が同期的 ◦ deferで並⾏にする • リソースの読み込み順のミス ◦ 読み込みの優先度を変える
▪ 計測が必要 ▪ prefetchやpreloadなどを適切に使う • APIのコール順やコールするタイミングのミス ◦ 依存関係のないAPIはPromise.allなどで並列に ◦ Intersection Observerで画⾯に⼊ったタイミングでAPIコール 参考:https://zenn.dev/monica/articles/7e060938f72073
応答が遅いAPI:2023, 2025年 • やることがISUCONっぽいが、WSHでも有効 • [2023] N+1問題 ◦ GraphQLでN+1が発⽣することがある ▪
DataLoader などを使って対処する • [2025] スロークエリ ◦ インデックスを張る ◦ レスポンスサイズを削るためにlimitをつける 参考:https://zenn.dev/shun_shobon/articles/173450f5bec890
これでやっとUIに着⼿できる...✨
None
UIに⼿を加える前に • まず現状と向き合う ◦ よっしゃ改善やるぞうぉぉ!!!と前のめりになりがち ◦ 推測より計測 • テストを正とする ◦
テストが落ちなければ、挙動のデグレはないと⾒做せる ◦ 特にE2E(VRT)を整備する ▪ 年度によってはローカル実⾏向けのE2Eが組まれている状態で提供 ◦ ユニットテストで⼩さくはじめても◯
UI関連の改善の例 • CSSの値をJSなどで計算する ◦ アニメーション ◦ 過去にJSでしか出来なかったUIの表現 • マルチメディアのサイズが⼤きい ◦
画像 ◦ 動画 ◦ アイコン系 • フォントを無駄に読み込んでいる ◦ 使わない⽂字まで読み込んでいる ◦ CLSを引き起こすような使い⽅
CSSの値をJSなどで計算する:2022, 2024年 • [2022] アニメーションにframer-motionなどを使っている ◦ アニメーションライブラリ⾃体が重いケース • [2022] 画像がCanvas
◦ JSでobject-fit的なことをしてCanvasに描画している • [2024] 画像がCanvas + シェーダー ◦ ThreejsとGLSLでobject-fit的なことをしてCanvasに描画している 2024年のやつは 私が作りました
マルチメディアのサイズが⼤きい:2022年 • 画像はSquooshなどで、動画はFFmpegなどで圧縮する ◦ VRTが落ちない程度にサイズを減らす ◦ オンデマンドで圧縮はさける。事前に圧縮(WSHでよくある罠) • ファイルの形式を変える ◦
画像はWebPやAVIFのようなサイズの⼩さい形式に変換 • アイコン系ライブラリの使い⽅を⾒直す、置き換える ◦ アイコンを全て読み込むような使い⽅になっているケースも ◦ 少なければ画像に1つずつ書き出してCDNなどに配置
フォントを無駄に読み込んでいる:2020, 2022年 • フォントのサブセット化 ◦ フォントファイルは subset-font などでサブセット化 ◦ Google
Fontsの場合は &text= で使⽤⽂字を指定してサブセット化 • その他サブセット化の参考 ◦ https://blog.jxck.io/entries/2016-03-14/web-font-noto-sans.html ◦ https://blog.jxck.io/entries/2019-10-13/font-feature-settings.html ◦ https://blog.jxck.io/entries/2020-09-07/font-subsetting-with-puppeteer.html
おわりに • あくまで計測が優先 ◦ 計測が思うようにできないときにはじめて推測する • 計測がままならない場合、UI以外から着⼿ ◦ UI以外で⼿を加えれば確実に改善できる箇所を探す •
UI関連に着⼿する前にテストを整備 ◦ 特にE2EとVRT • ここで取り上げた問題以外にも、WSHでは様々な出題が⾏われています ◦ みなさんも是⾮参加してみてください!
ご清聴ありがとうございました