SlideShare a Scribd company logo
フロントエンドリプレース戦略
2021. 03. 10 Tsuji Yuko
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
自己紹介
• 辻 祐子 (@osunu)
• 2018年 株式会社カカクコム入社
• 食べログフロントエンドチームリーダー
• リプレースプロジェクト推進、採用、チームビルディング
• テニミュ、特撮、アニメが好き
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
目次 1. 食べログフロントエンドの
リプレースプロジェクトについて
2. リリース戦略について
3. リリース戦略の実現手段について
4. まとめ&今後の課題
1. 食べログフロントエンドの
リプレースプロジェクトについて
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
食べログフロントエンドリプレースプロジェクト
 2005年サービス開始で、歴史あるサービス食べログ
 いろいろあってフロントエンドがそこそこカオス!
 メンテナンス性が高いシステムに構築しなおしたい…
 jQueryからReact/TypeScript にリプレースしよう!
 詳しくはブログを読んでね 😚
 食べログ フロントエンドエンジニアブログ
 https://note.com/tabelog_frontend
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
食べログフロントエンドリプレースプロジェクト
React !!
jQuery
jQuery
jQuery
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
どうして一部だけ?
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
っていうか
どうやって共存?
2. リリース戦略について
Ruby on Rails上で部分的にリプレースを進めている理由
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
食べログって、いろんなページがあります!
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
食べログの状況とプロジェクトの規模感
Ruby on Rails アプリケーション 25個
エントリーポイント 1532ファイル
JSファイル行数 210,760行 ※node_moduleは含まず
1週間にリリースされるissue 100件〜
 短期/中期での全体的なリプレースはスコープ外
 長期戦!!
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
なぜページ毎のリリースを選択しなかったか
 リリースの単位が大きくなりすぎるから
• 食べログは多機能&複雑で、ページごとのリリースは数ヶ月〜半年レベル
• 開発期間が長引くほど、機能開発の追従のコストが嵩む
• リリースが単位が大きいほどリスクが大きくなる
 大量のコンポーネント2重管理がメンテナンス性を下げるから
• Reactへの移行期間が長く、その間のメンテナンス性低下を許容できない
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
部分毎リリースのメリットとデメリット
 メリット😚
• リリースのスパンが短く、機能開発の追従のコストが最小限
• コンポーネント2重管理を抑制できる
• 共存状態が長期間に渡っても、メンテナンス性を下げにくい
 デメリット🥺
• 参考情報・事例が少ない
→しょうがない!そもそもこの規模の事例が殆どない
→重要度の低い小さい機能から段階的に検証&リリースをする
• ページ内読み込みファイル数が増え、パフォーマンスが低下
→既存のjQuery領域のパフォーマンスを改善する
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
ページごとの分離を諦めたわけじゃない
Ruby on Rails Ruby on Rails Next.js?
部分的にReactを導入する ページ内のReact領域を増やす ページ内が全てReactになった時点で
Ruby on Railsから切り離す
→ →
3.リリース戦略の実現手段について
どうやってRuby on Rails上で共存させるか
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
分離するまで、どうやって共存するのか
Ruby on Rails Ruby on Rails Next.js?
部分的にReactを導入する ページ内のReact領域を増やす ページ内が全てReactになった時点で
Ruby on Railsから切り離す
→ →
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
共存手段選定の観点
共存期間が長くなっても大丈夫なように!
jQueryとReactが
疎結合であること
 jQueryのカオスを引き継ぎたくない
 Reactのリプレースリリース時にjQueryのテストをしたくない
運用が容易であること  共存ページでjQueryの機能開発を今まで通りすすめられるように
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
共存手段選定の観点
手段1 Reactのコンポーネントを別パッケージとし、
jQueryベースの既存エントリポイントからimportする
手段2 Reactベースの新規エントリポイントから
ReactのコンポーネントとjQueryのコンポーネント両方をimportする
手段3 jQueryベース,Reactベースのエントリポイントを共存させる
採用!
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
手段1:Reactのコンポーネント別パッケージとし、
jQueryベースの既存エントリポイントからimportする
※イメージです
Ruby on Rails
(slim or erb)
<html>
<head>
<script src=“jquery.js“></script>
<script src=“jquery-bundled.js“></script>
</head>
<body>
<p>食べログだよ!</p>
<a class=“js-click-shop”>店舗ページへ</a>
<div class=“react-hoge-a”>
<!— ここにreactがレンダリングされる —>
</div>
</body>
</html>
jQuery-component-a
jQuery-entrypoint
jQuery-component-b
React-entrypoint
React-component-b
React-component-a
jQuery関連ファイルだけBundle
React関連ファイルだけBundle
React-bundled.js
❌ 不採用
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
手段1:Reactのコンポーネント別パッケージとし、
jQueryベースの既存エントリポイントからimportする
• メリット
• jQueryとReactのコンポーネントが疎結合になる
• ビルドは2回必要だが、それぞれやることはシンプル
• デメリット😨
• Reactの機能をjQueryに組み込んだ状態でおかしな表示や挙動を見つけた時に、ビルド
後のJSの場合、デバッグがしづらく原因の特定が困難。
🙅不採用
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
手段2:Reactベースの新規エントリポイントから
ReactのコンポーネントとjQueryのコンポーネント両方をimportする
※イメージです
Ruby on Rails
(slim or erb)
<html>
<head>
<script src=“react-bundled.js“></script>
</head>
<body>
<p>食べログだよ!</p>
<a class=“js-click-shop”>店舗ページへ</a>
<div class=“react-hoge-a”>
<!— ここにreactがレンダリングされる —>
</div>
</body>
</html>
jQuery-component-a
jQuery-component-b
React-entrypoint
React-component-b
React-component-a
jQuery, React関連ファイル全てを1度にBundle
❌ 不採用
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
手段2:Reactベースの新規エントリポイントから
ReactのコンポーネントとjQueryのコンポーネント両方をimportする
• メリット
• React公式ドキュメントの「DOM 操作プラグインとのインテグレーション」で紹介され
ており、お手本実装がある
• デメリット😨
• jQueryとReactが疎結合にならない
• ReactベースとjQueryベース両方のページで使われている既存モジュールは、
React/jQuery両方エントリポイントで動くことのテストが必要になる
🙅不採用
🙅不採用
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
手段3:jQueryベース, Reactベースのエントリポイントを共存させる
※イメージです
Ruby on Rails
(slim or erb)
<html>
<head>
<script src=“jquery.js“></script>
<script src=“jquery-bundled.js“></script>
<script src=“react-bundled.js“></script>
</head>
<body>
<p>食べログだよ!</p>
<a class=“js-click-shop”>店舗ページへ</a>
<div class=“react-hoge-a”>
<!— ここにreactがレンダリングされる —>
</div>
</body>
</html>
jQuery-component-a
jQuery-entrypoint
jQuery-component-b
React-entrypoint
React-component-b
React-component-a
jQuery関連ファイルだけBundle
React関連ファイルだけBundle
⭕ 採用
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
手段3:jQueryベース, Reactベースのエントリポイントを共存させる
• メリット
• jQueryとReactのコンポーネントが疎結合になる
• ビルドは2回必要だが、それぞれやることはシンプル
• デメリット
• ページ内にランタイムが複数存在する
→jQuery/React双方が影響しあわないよう運用でカバー
• 1ページの読込ファイル数が増え、パフォーマンスに影響する
→既にリリースされた機能は規模も小さく許容範囲だった
→jQuery側のパフォーマンス改善をリプレースと並行して行う
🙆採用
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
実際に手段3でやってみた感想
 jQueryとReactを疎結合にできて良かった✨
• 完全に別でビルドができて、
jQuery,Reactそれぞれのテストだけでリリースが出来るので、機能改善のペースをキープ
 jQueryベースのカオスを引き継がず、Reactはキレイな世界✨
• テストカバレッジ: Branch 95%
• インテグレーションテスト環境の整備(APIのモック化)
• Schemaドリブン、コンポーネントドリブンな開発
• アクセシビリティを意識した実装 👈詳しくはブログで!
 1ページにランタイムが2つあっても運用可能✨
• お互いのDOMを触らない運用ルールで無事故
 パフォーマンスの懸念🥺
• React導入した場合のバンドルサイズを確認できた
• 今後SPのリプレースを進めるときより厳しくパフォーマンスの調整が必要
4. まとめ&今後の課題
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
まとめ
 食べログのフロントエンドリプレースプロジェクトは長期戦
 ページごとのリリースは最新機能の追従や2重管理の発生によるコストが大きく
なるため、コンポーネントごとにリリースします
 ページ内でjQueryベース,Reactベースのエントリポイントを共存させ、
コンポーネント毎のリリースを実現しています
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
今後の課題
 Next.jsの導入!
• 1ページまるごとReactにできる未来が見えてきた
• Server Side RenderingでSEO対策をしたい
• Client Side Renderingだけじゃまだ駄目だって
• 絶賛進行中!!
• もう少し進んだらブログに書けたらいいな
• 食べログ フロントエンドエンジニアブログ
• https://note.com/tabelog_frontend
Next.js!!!
ページ内が全てReactになった時点で
Ruby on Railsから切り離す
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
さいごに
 We are hiring!!!!
 一緒に大規模システムのリプレースに取り組みませんか?
 フロントエンド以外の職種も募集中です❤
 https://www.wantedly.com/projects/254221

More Related Content

What's hot

なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? - なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
健人 井関
 

What's hot (20)

開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
 
Ansibleで始めるインフラ構築自動化
Ansibleで始めるインフラ構築自動化Ansibleで始めるインフラ構築自動化
Ansibleで始めるインフラ構築自動化
 
オープンソースのAPIゲートウェイ Kong ご紹介
オープンソースのAPIゲートウェイ Kong ご紹介 オープンソースのAPIゲートウェイ Kong ご紹介
オープンソースのAPIゲートウェイ Kong ご紹介
 
SQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォークSQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォーク
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
アジャイルジャーニー
アジャイルジャーニーアジャイルジャーニー
アジャイルジャーニー
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
Re: ゼロから始める監視設計
Re: ゼロから始める監視設計Re: ゼロから始める監視設計
Re: ゼロから始める監視設計
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
 
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? - なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
 
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
 
上司が信用できない会社の内部統制~第32回WebSig会議「便利さと、怖さと、心強さと〜戦う会社のための社内セキュリティ 2013年のスタンダードとは?!...
上司が信用できない会社の内部統制~第32回WebSig会議「便利さと、怖さと、心強さと〜戦う会社のための社内セキュリティ 2013年のスタンダードとは?!...上司が信用できない会社の内部統制~第32回WebSig会議「便利さと、怖さと、心強さと〜戦う会社のための社内セキュリティ 2013年のスタンダードとは?!...
上司が信用できない会社の内部統制~第32回WebSig会議「便利さと、怖さと、心強さと〜戦う会社のための社内セキュリティ 2013年のスタンダードとは?!...
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 

Similar to 食べログのフロントエンドリプレース戦略

Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
Ayumu Kawaguchi
 

Similar to 食べログのフロントエンドリプレース戦略 (20)

20140823 LL diver Angular.js で構築した note に関して
20140823 LL diver Angular.js で構築した note に関して20140823 LL diver Angular.js で構築した note に関して
20140823 LL diver Angular.js で構築した note に関して
 
WebデザイナのためのjQuery入門。
WebデザイナのためのjQuery入門。WebデザイナのためのjQuery入門。
WebデザイナのためのjQuery入門。
 
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_cccSpring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
 
Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介
 
Spath for enterprise
Spath for enterpriseSpath for enterprise
Spath for enterprise
 
YJTC18 A-1 大規模サーバの戦略
YJTC18 A-1 大規模サーバの戦略YJTC18 A-1 大規模サーバの戦略
YJTC18 A-1 大規模サーバの戦略
 
HTML5の前のJavaScript入門
HTML5の前のJavaScript入門HTML5の前のJavaScript入門
HTML5の前のJavaScript入門
 
全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験
 
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
 
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web ServiceアプリケーションAngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
 
5分でわかる!ownCloudアドオンの作り方
5分でわかる!ownCloudアドオンの作り方5分でわかる!ownCloudアドオンの作り方
5分でわかる!ownCloudアドオンの作り方
 
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習
 
Autonomous を支える技術、Oracle Database 18c デモンストレーション
Autonomous を支える技術、Oracle Database 18c デモンストレーションAutonomous を支える技術、Oracle Database 18c デモンストレーション
Autonomous を支える技術、Oracle Database 18c デモンストレーション
 
リクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアル
リクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアルリクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアル
リクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアル
 
Project Management Plan Sample Creative Content Lab Tokyo
Project Management Plan Sample Creative Content Lab TokyoProject Management Plan Sample Creative Content Lab Tokyo
Project Management Plan Sample Creative Content Lab Tokyo
 
Qiita Night 足場固めからやるマイクロサービス
Qiita Night 足場固めからやるマイクロサービスQiita Night 足場固めからやるマイクロサービス
Qiita Night 足場固めからやるマイクロサービス
 
20190319 xtech recochoku_15m_pub
20190319 xtech recochoku_15m_pub20190319 xtech recochoku_15m_pub
20190319 xtech recochoku_15m_pub
 
TeachmeBizを支えるフロントエンドのアーキテクチャと品質担保
TeachmeBizを支えるフロントエンドのアーキテクチャと品質担保TeachmeBizを支えるフロントエンドのアーキテクチャと品質担保
TeachmeBizを支えるフロントエンドのアーキテクチャと品質担保
 
JDK: 新しいリリースモデル解説
JDK: 新しいリリースモデル解説JDK: 新しいリリースモデル解説
JDK: 新しいリリースモデル解説
 

Recently uploaded

2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
ssuserbefd24
 

Recently uploaded (12)

2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
 
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
 
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 

食べログのフロントエンドリプレース戦略

  • 2. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 自己紹介 • 辻 祐子 (@osunu) • 2018年 株式会社カカクコム入社 • 食べログフロントエンドチームリーダー • リプレースプロジェクト推進、採用、チームビルディング • テニミュ、特撮、アニメが好き
  • 3. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 目次 1. 食べログフロントエンドの リプレースプロジェクトについて 2. リリース戦略について 3. リリース戦略の実現手段について 4. まとめ&今後の課題
  • 5. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 食べログフロントエンドリプレースプロジェクト  2005年サービス開始で、歴史あるサービス食べログ  いろいろあってフロントエンドがそこそこカオス!  メンテナンス性が高いシステムに構築しなおしたい…  jQueryからReact/TypeScript にリプレースしよう!  詳しくはブログを読んでね 😚  食べログ フロントエンドエンジニアブログ  https://note.com/tabelog_frontend
  • 6. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 食べログフロントエンドリプレースプロジェクト React !! jQuery jQuery jQuery
  • 7. Copyright (c) Kakaku.com, Inc. All Rights Reserved. どうして一部だけ?
  • 8. Copyright (c) Kakaku.com, Inc. All Rights Reserved. っていうか どうやって共存?
  • 9. 2. リリース戦略について Ruby on Rails上で部分的にリプレースを進めている理由
  • 10. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 食べログって、いろんなページがあります!
  • 11. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 食べログの状況とプロジェクトの規模感 Ruby on Rails アプリケーション 25個 エントリーポイント 1532ファイル JSファイル行数 210,760行 ※node_moduleは含まず 1週間にリリースされるissue 100件〜  短期/中期での全体的なリプレースはスコープ外  長期戦!!
  • 12. Copyright (c) Kakaku.com, Inc. All Rights Reserved. なぜページ毎のリリースを選択しなかったか  リリースの単位が大きくなりすぎるから • 食べログは多機能&複雑で、ページごとのリリースは数ヶ月〜半年レベル • 開発期間が長引くほど、機能開発の追従のコストが嵩む • リリースが単位が大きいほどリスクが大きくなる  大量のコンポーネント2重管理がメンテナンス性を下げるから • Reactへの移行期間が長く、その間のメンテナンス性低下を許容できない
  • 13. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 部分毎リリースのメリットとデメリット  メリット😚 • リリースのスパンが短く、機能開発の追従のコストが最小限 • コンポーネント2重管理を抑制できる • 共存状態が長期間に渡っても、メンテナンス性を下げにくい  デメリット🥺 • 参考情報・事例が少ない →しょうがない!そもそもこの規模の事例が殆どない →重要度の低い小さい機能から段階的に検証&リリースをする • ページ内読み込みファイル数が増え、パフォーマンスが低下 →既存のjQuery領域のパフォーマンスを改善する
  • 14. Copyright (c) Kakaku.com, Inc. All Rights Reserved. ページごとの分離を諦めたわけじゃない Ruby on Rails Ruby on Rails Next.js? 部分的にReactを導入する ページ内のReact領域を増やす ページ内が全てReactになった時点で Ruby on Railsから切り離す → →
  • 16. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 分離するまで、どうやって共存するのか Ruby on Rails Ruby on Rails Next.js? 部分的にReactを導入する ページ内のReact領域を増やす ページ内が全てReactになった時点で Ruby on Railsから切り離す → →
  • 17. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 共存手段選定の観点 共存期間が長くなっても大丈夫なように! jQueryとReactが 疎結合であること  jQueryのカオスを引き継ぎたくない  Reactのリプレースリリース時にjQueryのテストをしたくない 運用が容易であること  共存ページでjQueryの機能開発を今まで通りすすめられるように
  • 18. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 共存手段選定の観点 手段1 Reactのコンポーネントを別パッケージとし、 jQueryベースの既存エントリポイントからimportする 手段2 Reactベースの新規エントリポイントから ReactのコンポーネントとjQueryのコンポーネント両方をimportする 手段3 jQueryベース,Reactベースのエントリポイントを共存させる 採用!
  • 19. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 手段1:Reactのコンポーネント別パッケージとし、 jQueryベースの既存エントリポイントからimportする ※イメージです Ruby on Rails (slim or erb) <html> <head> <script src=“jquery.js“></script> <script src=“jquery-bundled.js“></script> </head> <body> <p>食べログだよ!</p> <a class=“js-click-shop”>店舗ページへ</a> <div class=“react-hoge-a”> <!— ここにreactがレンダリングされる —> </div> </body> </html> jQuery-component-a jQuery-entrypoint jQuery-component-b React-entrypoint React-component-b React-component-a jQuery関連ファイルだけBundle React関連ファイルだけBundle React-bundled.js ❌ 不採用
  • 20. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 手段1:Reactのコンポーネント別パッケージとし、 jQueryベースの既存エントリポイントからimportする • メリット • jQueryとReactのコンポーネントが疎結合になる • ビルドは2回必要だが、それぞれやることはシンプル • デメリット😨 • Reactの機能をjQueryに組み込んだ状態でおかしな表示や挙動を見つけた時に、ビルド 後のJSの場合、デバッグがしづらく原因の特定が困難。 🙅不採用
  • 21. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 手段2:Reactベースの新規エントリポイントから ReactのコンポーネントとjQueryのコンポーネント両方をimportする ※イメージです Ruby on Rails (slim or erb) <html> <head> <script src=“react-bundled.js“></script> </head> <body> <p>食べログだよ!</p> <a class=“js-click-shop”>店舗ページへ</a> <div class=“react-hoge-a”> <!— ここにreactがレンダリングされる —> </div> </body> </html> jQuery-component-a jQuery-component-b React-entrypoint React-component-b React-component-a jQuery, React関連ファイル全てを1度にBundle ❌ 不採用
  • 22. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 手段2:Reactベースの新規エントリポイントから ReactのコンポーネントとjQueryのコンポーネント両方をimportする • メリット • React公式ドキュメントの「DOM 操作プラグインとのインテグレーション」で紹介され ており、お手本実装がある • デメリット😨 • jQueryとReactが疎結合にならない • ReactベースとjQueryベース両方のページで使われている既存モジュールは、 React/jQuery両方エントリポイントで動くことのテストが必要になる 🙅不採用 🙅不採用
  • 23. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 手段3:jQueryベース, Reactベースのエントリポイントを共存させる ※イメージです Ruby on Rails (slim or erb) <html> <head> <script src=“jquery.js“></script> <script src=“jquery-bundled.js“></script> <script src=“react-bundled.js“></script> </head> <body> <p>食べログだよ!</p> <a class=“js-click-shop”>店舗ページへ</a> <div class=“react-hoge-a”> <!— ここにreactがレンダリングされる —> </div> </body> </html> jQuery-component-a jQuery-entrypoint jQuery-component-b React-entrypoint React-component-b React-component-a jQuery関連ファイルだけBundle React関連ファイルだけBundle ⭕ 採用
  • 24. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 手段3:jQueryベース, Reactベースのエントリポイントを共存させる • メリット • jQueryとReactのコンポーネントが疎結合になる • ビルドは2回必要だが、それぞれやることはシンプル • デメリット • ページ内にランタイムが複数存在する →jQuery/React双方が影響しあわないよう運用でカバー • 1ページの読込ファイル数が増え、パフォーマンスに影響する →既にリリースされた機能は規模も小さく許容範囲だった →jQuery側のパフォーマンス改善をリプレースと並行して行う 🙆採用
  • 25. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 実際に手段3でやってみた感想  jQueryとReactを疎結合にできて良かった✨ • 完全に別でビルドができて、 jQuery,Reactそれぞれのテストだけでリリースが出来るので、機能改善のペースをキープ  jQueryベースのカオスを引き継がず、Reactはキレイな世界✨ • テストカバレッジ: Branch 95% • インテグレーションテスト環境の整備(APIのモック化) • Schemaドリブン、コンポーネントドリブンな開発 • アクセシビリティを意識した実装 👈詳しくはブログで!  1ページにランタイムが2つあっても運用可能✨ • お互いのDOMを触らない運用ルールで無事故  パフォーマンスの懸念🥺 • React導入した場合のバンドルサイズを確認できた • 今後SPのリプレースを進めるときより厳しくパフォーマンスの調整が必要
  • 27. Copyright (c) Kakaku.com, Inc. All Rights Reserved. まとめ  食べログのフロントエンドリプレースプロジェクトは長期戦  ページごとのリリースは最新機能の追従や2重管理の発生によるコストが大きく なるため、コンポーネントごとにリリースします  ページ内でjQueryベース,Reactベースのエントリポイントを共存させ、 コンポーネント毎のリリースを実現しています
  • 28. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 今後の課題  Next.jsの導入! • 1ページまるごとReactにできる未来が見えてきた • Server Side RenderingでSEO対策をしたい • Client Side Renderingだけじゃまだ駄目だって • 絶賛進行中!! • もう少し進んだらブログに書けたらいいな • 食べログ フロントエンドエンジニアブログ • https://note.com/tabelog_frontend Next.js!!! ページ内が全てReactになった時点で Ruby on Railsから切り離す
  • 29. Copyright (c) Kakaku.com, Inc. All Rights Reserved. さいごに  We are hiring!!!!  一緒に大規模システムのリプレースに取り組みませんか?  フロントエンド以外の職種も募集中です❤  https://www.wantedly.com/projects/254221