Slide 1

Slide 1 text

「バイトル」のTypeScriptリニューアル 〜 積み上がったレガシーとパフォーマンスに挑む現在地 〜 ディップ 横⼭ 隼 2026/05/23 TSKaigi 2026

Slide 2

Slide 2 text

横⼭ 隼 Yokoyama Hayato ディップ株式会社 プロダクトソリューション部メディアWeb開発課 2022年 新卒⼊社 現在の仕事 バイトルの求職者向けサイトのリニューアル 主にフロントエンド

Slide 3

Slide 3 text

× “Labor force solution company” ⼈材サービスとDXサービスの提供を通して、労働市場における諸課題を解決し、 誰もが働く喜びと幸せを感じられる社会の実現を⽬指します。 VISION Human work force solution ユーザーファーストな独⾃機能を搭載した、 求⼈情報‧⼈材紹介サービスの提供を通じて、 ユーザーの就業課題を解決しています。 ⼈材サービス事業 Digital labor force solution バイトコミュニケーションアプリ『バイトルトーク』や、 機能を絞ったシンプルなSaaS型の『コボット』を通じて、 職場環境やコミュニケーション課題を解決しています。 DX事業

Slide 4

Slide 4 text

Copyright © DIP Corporation, All rights reserved. 📝 本⽇お話しすること 弊社プロダクト「バイトル」のリニューアルで取り組んだパフォーマンス改善のお話をします。 王道な取り組みから、ちょっとニッチな事例まで、 プロダクトを選ばず、明⽇から取り組めるものもご紹介します。 "⾃分のチームでも試せそう" と思えるものを1つでも持ち帰っていただけたら幸いです。

Slide 5

Slide 5 text

Copyright © DIP Corporation, All rights reserved. 20年超えの歴史を持つ アルバイト求⼈サービス

Slide 6

Slide 6 text

Copyright © DIP Corporation, All rights reserved. インターネットの家庭普及率が18%程度だった2002年 「バイトル」サービス開始

Slide 7

Slide 7 text

Copyright © DIP Corporation, All rights reserved. スマホ普及率が4%だった2010年 ガラケー全盛期に「動画」で仕事探しができる機能を実装

Slide 8

Slide 8 text

Copyright © DIP Corporation, All rights reserved. 2024年⽇本初となる対話型バイト探しサービス 「dip AI AGENT」をリリース

Slide 9

Slide 9 text

Copyright © DIP Corporation, All rights reserved. サービスは成⻑を続けている

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

Copyright © DIP Corporation, All rights reserved. そんな経緯もありバイトルを今 リニューアル

Slide 13

Slide 13 text

Copyright © DIP Corporation, All rights reserved. TypeScript ⾔語 React Router (framework mode) フレームワーク CSS Modules スタイリング Vite 8 ビルド Rolldown Oxlint / Oxfmt リンター / テスト Vitest TypeSpec API定義 / 型⽣成 Orval React 技術スタック

Slide 14

Slide 14 text

Copyright © DIP Corporation, All rights reserved. ✅ 型安全性を⼿に⼊れて、動かすまで気付かないバグが消えた ✅ テストもちゃんと書けるようになった ✅ 型に守られて、AI駆動で開発が爆速になった

Slide 15

Slide 15 text

Copyright © DIP Corporation, All rights reserved. 万全に進めてきた リニューアル

Slide 16

Slide 16 text

Copyright © DIP Corporation, All rights reserved. 負荷テストで 本番相当の負荷を流すと

Slide 17

Slide 17 text

Copyright © DIP Corporation, All rights reserved. ......

Slide 18

Slide 18 text

Copyright © DIP Corporation, All rights reserved.

Slide 19

Slide 19 text

Copyright © DIP Corporation, All rights reserved.

Slide 20

Slide 20 text

Copyright © DIP Corporation, All rights reserved.

Slide 21

Slide 21 text

Copyright © DIP Corporation, All rights reserved.

Slide 22

Slide 22 text

Copyright © DIP Corporation, All rights reserved.

Slide 23

Slide 23 text

Copyright © DIP Corporation, All rights reserved. 型もテストもあるから、AIで仕様通りに動くものはサクサク作れた。 API,DB などの⼀部は既存のものを継承する設計だった。 結果、どかっと機械的に負荷をかけたら、改善点が⾒つかった。

Slide 24

Slide 24 text

Copyright © DIP Corporation, All rights reserved. 型もテストもあるから、AIで仕様通りに動くものはサクサク作れた。 API,DB などの⼀部は既存のものを継承する設計だった。 結果、どかっと機械的に負荷をかけたら、改善点が⾒つかった。 ➡ やるしかない

Slide 25

Slide 25 text

Copyright © DIP Corporation, All rights reserved. TypeScriptのパフォーマンス改善 ● 型チェック‧コンパイルにかかる時間を短縮すること ● JavaScriptにコンパイルされた後、⾼速に動くこと

Slide 26

Slide 26 text

Copyright © DIP Corporation, All rights reserved. TypeScriptのパフォーマンス改善 ● 型チェック‧コンパイルにかかる時間を短縮すること ● JavaScriptにコンパイルされた後、⾼速に動くこと ←今回 狙うはこっち

Slide 27

Slide 27 text

Copyright © DIP Corporation, All rights reserved. まず「低コストかつ効果が⼤きそうなもの」を中⼼に取り組んだ

Slide 28

Slide 28 text

Copyright © DIP Corporation, All rights reserved. 画像の軽量化やWebP変換

Slide 29

Slide 29 text

Copyright © DIP Corporation, All rights reserved. loading="lazy" / fetchpriority="high" / rel="preconnect" など リソースの読み込み優先度やタイミングの調整 外部リソースの⾮同期読み込み 外部リソースの事前接続 画像の遅延読み込み

Slide 30

Slide 30 text

Copyright © DIP Corporation, All rights reserved. Cache-Control ヘッダーの設定し 可能な限りCDNキャッシュから配信 "Cache-Control": "public, max-age=31536000, immutable" ハッシュ付きの静的アセット

Slide 31

Slide 31 text

Copyright © DIP Corporation, All rights reserved. かなり効果はあった 👍

Slide 32

Slide 32 text

Copyright © DIP Corporation, All rights reserved. もうちょっとミクロな問題への取り組みも 1. 計測‧広告タグのメインスレッド占領によるパフォーマンス低下 2. ⼤量に分割されたJavaScript,CSSによるリクエスト数増加 3. Core Web Vitalsを可視化できていない

Slide 33

Slide 33 text

Copyright © DIP Corporation, All rights reserved. もうちょっとミクロな問題への取り組みも 1. 計測‧広告タグのメインスレッド占領によるパフォーマンス低下 2. ⼤量に分割されたJavaScript,CSSによるリクエスト数増加 3. Core Web Vitalsを可視化できていない

Slide 34

Slide 34 text

Copyright © DIP Corporation, All rights reserved. 現バイトルから受け継いだ 計測‧広告タグの積み重なりによるパフォーマンスの悪化 ● ⻑年の機能拡張に応じて、計測‧広告タグが肥⼤ ● 初期ロード時にメインスレッドが⻑時間占有され、 Core Web Vitals(特にTBT) が悪化した ⚠ リニューアルでも計測‧広告タグの多くを引き継ぐ

Slide 35

Slide 35 text

Copyright © DIP Corporation, All rights reserved. requestIdleCallback() で計測タグが 描画とユーザー操作をブロックしないようにする requestIdleCallback() でアイドル状態になったタイミングで、 スクリプトが発⽕するように調整

Slide 36

Slide 36 text

Copyright © DIP Corporation, All rights reserved. もうちょっとミクロな問題への取り組みも 1. 計測‧広告タグのメインスレッド占領によるパフォーマンス低下 2. ⼤量に分割されたJavaScript,CSSによるリクエスト数増加 3. Core Web Vitalsを可視化できていない

Slide 37

Slide 37 text

Copyright © DIP Corporation, All rights reserved. JavaScriptやCSSが過剰に分割され リクエスト数が増加していた

Slide 38

Slide 38 text

Copyright © DIP Corporation, All rights reserved. バンドルを可視化して改善点を特定

Slide 39

Slide 39 text

Copyright © DIP Corporation, All rights reserved. バンドルを可視化して改善点を特定 ➡ ⼤きなチャンクを動的インポートで切り出したり ⼩さすぎるチャンクを束ねたり、チャンク戦略を⾒直す

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

Copyright © DIP Corporation, All rights reserved. もうちょっとミクロな問題への取り組みも 1. 計測‧広告タグのメインスレッド占領によるパフォーマンス低下 2. ⼤量に分割されたJavaScript,CSSによるリクエスト数増加 3. Core Web Vitalsを可視化できていない

Slide 43

Slide 43 text

Copyright © DIP Corporation, All rights reserved. New RelicでCore Web Vitalsを可視化

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

dip_tech Copyright © DIP Corporation, All rights reserved. 最後に

Slide 46

Slide 46 text

Copyright © DIP Corporation, All rights reserved. まだまだ道の途中です パフォーマンス改善の余地はまだ沢⼭あります。 リニューアルしきれていない機能もあります。 テスト、デザインシステムなど、まだまだ整えるところもあります。

Slide 47

Slide 47 text

We are hiring ⼀緒に変⾰に挑戦する仲間を募集中です!