Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【TSKaigi2026登壇資料】バイトル」のTypeScriptリニューアル — 積み上か...

【TSKaigi2026登壇資料】バイトル」のTypeScriptリニューアル — 積み上がったレガシーとパフォーマンスに挑む現在地

More Decks by ディップ株式会社

Transcript

  1. × “Labor force solution company” ⼈材サービスとDXサービスの提供を通して、労働市場における諸課題を解決し、 誰もが働く喜びと幸せを感じられる社会の実現を⽬指します。 VISION Human work

    force solution ユーザーファーストな独⾃機能を搭載した、 求⼈情報‧⼈材紹介サービスの提供を通じて、 ユーザーの就業課題を解決しています。 ⼈材サービス事業 Digital labor force solution バイトコミュニケーションアプリ『バイトルトーク』や、 機能を絞ったシンプルなSaaS型の『コボット』を通じて、 職場環境やコミュニケーション課題を解決しています。 DX事業
  2. Copyright © DIP Corporation, All rights reserved. 📝 本⽇お話しすること 弊社プロダクト「バイトル」のリニューアルで取り組んだパフォーマンス改善のお話をします。

    王道な取り組みから、ちょっとニッチな事例まで、 プロダクトを選ばず、明⽇から取り組めるものもご紹介します。 "⾃分のチームでも試せそう" と思えるものを1つでも持ち帰っていただけたら幸いです。
  3. Copyright © DIP Corporation, All rights reserved. サービスの成⻑に伴って「技術的負債」は溜まってきた • JavaScriptで動いているため型安全性がなく、動かすまでバグに気付けない

    • グローバルスコープのCSS (Sass) で、1つ直すとどこに影響があるか分からない • テストが形骸化している‧存在しない • ライブラリのバージョンをあげるだけでもきつい
  4. Copyright © DIP Corporation, All rights reserved. サービスの成⻑に伴って「技術的負債」は溜まってきた • JavaScriptで動いているため型安全性がなく、動かすまでバグに気付けない

    • グローバルスコープのCSS (Sass) で、1つ直すとどこに影響があるか分からない • テストが形骸化している‧存在しない • ライブラリのバージョンをあげるだけでもきつい ➡ 事業の成⻑を⽀えられない
  5. Copyright © DIP Corporation, All rights reserved. TypeScript ⾔語 React

    Router (framework mode) フレームワーク CSS Modules スタイリング Vite 8 ビルド Rolldown Oxlint / Oxfmt リンター / テスト Vitest TypeSpec API定義 / 型⽣成 Orval React 技術スタック
  6. Copyright © DIP Corporation, All rights reserved. ✅ 型安全性を⼿に⼊れて、動かすまで気付かないバグが消えた ✅

    テストもちゃんと書けるようになった ✅ 型に守られて、AI駆動で開発が爆速になった
  7. Copyright © DIP Corporation, All rights reserved. loading="lazy" / fetchpriority="high"

    / rel="preconnect" など リソースの読み込み優先度やタイミングの調整 <img src="thumb.jpg" loading="lazy" /> <link rel="preconnect" href="https://fonts.googleapis.com" /> <script async src="https://example.com/script.js"></script> 外部リソースの⾮同期読み込み 外部リソースの事前接続 画像の遅延読み込み
  8. Copyright © DIP Corporation, All rights reserved. Cache-Control ヘッダーの設定し 可能な限りCDNキャッシュから配信

    "Cache-Control": "public, max-age=31536000, immutable" ハッシュ付きの静的アセット
  9. Copyright © DIP Corporation, All rights reserved. 現バイトルから受け継いだ 計測‧広告タグの積み重なりによるパフォーマンスの悪化 •

    ⻑年の機能拡張に応じて、計測‧広告タグが肥⼤ • 初期ロード時にメインスレッドが⻑時間占有され、 Core Web Vitals(特にTBT) が悪化した ⚠ リニューアルでも計測‧広告タグの多くを引き継ぐ
  10. Copyright © DIP Corporation, All rights reserved. requestIdleCallback() で計測タグが 描画とユーザー操作をブロックしないようにする

    requestIdleCallback() でアイドル状態になったタイミングで、 スクリプトが発⽕するように調整
  11. Copyright © DIP Corporation, All rights reserved. 📝 ⼤きすぎるチャンクは動的インポートに切り出す •

    動画再⽣ボタンが押されてから動画再⽣ライブラリをインポート • 検索バーがタップされたら、検索のシートコンポーネントをインポート 📝 ⼩さすぎるチャンクは束ねる • アイコンライブラリを1つに束ねる • デザインシステムを1つに束ねる
  12. Copyright © DIP Corporation, All rights reserved. 📝 ⼤きすぎるチャンクは動的インポートに切り出す •

    動画再⽣ボタンが押されてから動画再⽣ライブラリをインポート • 検索バーがタップされたら、検索のシートコンポーネントをインポート ✅ 初期転送量を削減し、ロード時間を改善 📝 ⼩さすぎるチャンクは束ねる • アイコンライブラリを1つに束ねる • デザインシステムを1つに束ねる
  13. Copyright © DIP Corporation, All rights reserved. ちょっとずつ改善出来てきている • ⾚(Poor)

    → ⻩(Needs Improvement) 、 ⻩(Needs Improvement) → 緑 (Good) になった。⼀段ずつ改善中 • パフォーマンスは、⼩さなベストプラクティスの積み重ね • 正直、TypeScript単体の部分での改善はあまり出来なかった tsconfigの "verbatimModuleSyntax": true , "isolatedModules": true などの 挙動がモダンバンドラーのデフォルトになっている • TypeScript, Viteの最新のエコシステムに乗ること⾃体が⼤きな最適化になった