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
プロダクト横断を見据えた刷新プロジェクトのフロントエンド開発 / front-end deve...
Search
Daiki Narushima
November 18, 2021
Programming
0
1.7k
プロダクト横断を見据えた刷新プロジェクトのフロントエンド開発 / front-end development in revamp project
GeekGig 『スタディサプリ x Showcase Gig』 〜フロントエンドを楽しむ〜
Daiki Narushima
November 18, 2021
Tweet
Share
Other Decks in Programming
See All in Programming
LLM Observabilityによる 対話型音声AIアプリケーションの安定運用
gekko0114
2
430
CSC307 Lecture 06
javiergs
PRO
0
690
0→1 フロントエンド開発 Tips🚀 #レバテックMeetup
bengo4com
0
570
生成AIを使ったコードレビューで定性的に品質カバー
chiilog
1
270
Fluid Templating in TYPO3 14
s2b
0
130
AIによるイベントストーミング図からのコード生成 / AI-powered code generation from Event Storming diagrams
nrslib
2
1.9k
Lambda のコードストレージ容量に気をつけましょう
tattwan718
0
130
Basic Architectures
denyspoltorak
0
680
そのAIレビュー、レビューしてますか? / Are you reviewing those AI reviews?
rkaga
6
4.6k
CSC307 Lecture 01
javiergs
PRO
0
690
Vibe Coding - AI 驅動的軟體開發
mickyp100
0
180
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
5
1k
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
55
12k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
120
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.2k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
71k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
61
52k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
1.9k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
230
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
450
Thoughts on Productivity
jonyablonski
74
5k
How Software Deployment tools have changed in the past 20 years
geshan
0
32k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
190
Transcript
プロダクト横断を見据えた 刷新プロジェクトのフロントエンド開発 2021/11/18@GeekGig
自己紹介 • 成嶋大樹(なるしまだいき) • 次世代店舗創出プラットフォーム「O:derプラットフォーム」の開 発において、O:der ToGoを担当 • ReactとTypeScriptが好き 2
株式会社Showcase Gig フロントエンドエンジニア dnrsm
今日話すこと プロダクト横断を見据えた 刷新プロジェクトのフロントエンド開発 3
アジェンダ • 刷新プロジェクトについて • プロダクト横断のコンポーネントについて • コンポーネントの設計で気をつけたこと • プロダクトの実装・技術スタック •
振り返りと学び 4
1. 刷新プロジェクトについて 5
Product Backend やろうとしてること 6
何を刷新するのか • Platformからフロントエンドまで技術刷新を行う ◦ 今回話すのはフロントエンドについて • Vue→Reactベースの技術スタックに置き換える • デザインも全く新しいものに置き換わる ◦
それに伴いデザインシステムも構築する • UI/UXを統一するためのコンポーネント基盤を作る 7
以前まではどうやっていたか • テイクアウトもテーブルオーダーも全く別のデザイン • 担当するチームがそれぞれ別のリポジトリで作業をしていた 8
O:der Backend Shared Components 9 何を刷新するのか
どうやって進めるのか • Yarn Workspaceでmonorepo構成に ◦ ひとつのリポジトリで複数の packageを管理 する • 各packageを担当するチームが独立して
作業をする ◦ 影響範囲を明確にする 10
どうやって進めるのか • eslint, tsconfig, prettierの設定を共通化 ◦ monorepoなのでルートに置いて各 package でextendsする形で利用 11
2. プロダクト横断のコンポーネントについて 12
O:der Backend Shared Components 13
Shared Componentsとは • 現状はOSSにはせず社内だけで使うコンポーネントライブラリ • toCプロダクトのデザインシステム • これをもとにテイクアウトアプリやイートインアプリを作る 14
なぜ作るのか • ユーザー体験や振る舞いを統一したい • 一貫したデザインによりユーザー体験を向上させる • 価値提供のスピードを向上させる • コンポーネントの作り方に一貫したルールができる 15
何を作ったのか 大きく分けると以下の3つ • 基礎的なUIパーツ • Brandingのためのパーツ • headlessなUIパーツ 16
基礎的なUIパーツ 17 • 外観を持つ抽象的な基礎コンポーネント • ButtonやTextFieldなど
Brandingのためのコンポーネント • 色・フォント・アイコンなどBrandingのためのコンポーネント • Typography, Iconなど 18
HeadlessなUIパーツ • 外観は持たず振る舞いとしての機能のみを持つ • ModalやTransitionなど • 細かいインタラクションなどもプロダクト間で統一できるように共通化 19
コンポーネントの責務について • 共通コンポーネント ◦ Atomic Designでいうところの、Atoms, Moleculesを主に実装する ◦ ローカルステート(useState)とロジックはなるべく持たないように •
プロダクト側のコンポーネント ◦ Atomic DesignでいうところのOrganims, Templatesを主に実装する ◦ データの取得・更新やロジックを含めて良い 20
どう作ったのか 主な技術スタック • React • TypeScript • CSS Modules プロダクト側のアーキテクチャで使いやすいように、純粋なReactコンポーネントとして提
供する 21
コンポーネントカタログの提供 22
コンポーネントカタログの提供 • ChromaticというUIテストやホスティングをしてくれるサービスを使って Storybookを公開してい る • どんなコンポーネントがあるのか一覧化することができる • コンポーネントの表示パターンや挙動や型情報を確認できる ◦
オンボーディングコストが下がる 23
3. コンポーネント設計で気をつけたこと 24
コンポーネント設計で気をつけたこと 1. プロダクトのコンテクストに引っ張られないように 2. 早まった共通化・抽象化をしないように 25
プロダクトのコンテクストに引っ張られないように 26
どう作ったのか(再掲) 主な技術スタック • React • TypeScript • CSS Modules プロダクト側のアーキテクチャで使いやすいように、純粋なReactコンポーネントとして提
供する 27
プロダクト側のコンテキストに引っ張られないように • Tagコンポーネントを例にすると、下の2つで共通なのは色がオレンジということだけ • 「注文済み」というコンテキストにつられて、オレンジの状態にしたいときにtype="orderComplete" のようにするのはNG • colorScheme="orange"のような色の情報だけを持つ汎用的なPropsにする 28
O:der Backend Shared Components 29 プロダクト側のコンテキストに引っ張られないように
• 共通コンポーネントは親からどのように利用されるかを知らない • 各Propsにどのような値を渡すかは親の責務 • 共通コンポーネントのPropsはプロダクト側のコンテキストに合わせず抽象的にする プロダクト側のコンテキストに引っ張られないように 30
早まった共通化・抽象化をしないように 31
やってしまったこと • プロダクト側のコンポーネントも頑張って抽象化しようとしてしまう ◦ 再利用を目的としてしまう • 安易にDRYにしようとしてしまう ◦ 同じようなことをしているから共通化して論理的凝集することが多かった ◦
プロダクト間でのユースケースを知る前に共通化しようとしてしまう 32
再利用化を目的とするあまり、副作用が多く脆弱な コンポーネントが出来上がってしまった 33
App Component A Page A Page B Component B Component
C 34
モジュールはたったひとつのアクターに対して責務を負うべきである 『Clean Architecture』SRP: 単一責任の原則 より 35
• 要するに、変更理由が一つであれば疎結合で依存性が少なくて済む • コンポーネントに名前をつけるときにしっくりくる名前が思いつかない場合、「複数の 責務を持っている」ことが多い ◦ 1つだけであればやっていることを命名すれば良いので楽 36
App Component A Page A Page B Component C Component
D Component B 37
どうすれば良かったのか • プロダクト側のコンポーネントはAtomic DesignでいうところのOrganismsと Templatesを主に実装する。ビジネスロジックとドメイン知識が入り込みやすいコン ポーネントなので、共通化するときは慎重に見極めることが大事。 • 共通化できる場合もあるだろうけど、いずれにせよ慎重に • アクターが異なる場合、最初から分離しておく
38
どうすれば良かったのか • はじめの段階では限定的なコンポーネントとして実装する • 共通化できそうなタイミングでリファクタリングをすれば良い 39
4. プロダクトの実装・技術スタック 40
プロダクトの実装・技術スタックについて 1. Next.jsの採用について 2. スキーマファースト開発 41
Next.jsの採用について 42
Next.jsの採用について • SSR/SSG/ハイブリッドなど要件に合わせやすい • ファイルベースルーティング ◦ pages/配下にファイルを置けばルーティングされるので、 react-router使って頑張って書 かなくて良いので楽 •
ゼロコンフィグ ◦ Webpackまわりなどの足回りが揃った状態から開発を始められる ◦ すぐにReact書き始められるので効率的 43
スキーマファースト開発 44
以前までは • OpenAPIを使ってはいたが放置されがちだった • openapi-generatorとか使ってないのでAPI通信まわりは自前実装 • APIまわりの型も書いたり書いてなかったり • APIの変更に追従しづらいので開発効率が悪かった 45
スキーマファースト開発 • OpenAPIを使ってAPIドキュメントを記述しています • スキーマからモックサーバーを使って開発を始められるので、バックエンドの実装 が終わるのを待たずにAPIと結合した開発が進められる • openapi-generatorでAPIクライアントと型を生成しているので、APIの変更に追従し やすく、クライアントとサーバー間で齟齬も起こりにくい 46
振り返りと学び • チームで独立して作業できる状態にはなった • コンポーネント実装の基本的なルールはできた • 共通コンポーネントは抽象的に作ることを常に意識する • コンポーネントについては最初は分離した状態で限定的なコンポーネントとして実 装した方が良さそう
• 設計に銀の弾丸というものはないので、サービスの成長とともにリファクタリングは 継続していく 47
ご清聴ありがとうございました 48