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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
610
生成AIを使ったコードレビューで定性的に品質カバー
chiilog
1
270
izumin5210のプロポーザルのネタ探し #tskaigi_msup
izumin5210
1
130
AI Agent の開発と運用を支える Durable Execution #AgentsInProd
izumin5210
7
2.3k
AI時代のキャリアプラン「技術の引力」からの脱出と「問い」へのいざない / tech-gravity
minodriven
21
7.2k
CSC307 Lecture 09
javiergs
PRO
1
840
Oxlint JS plugins
kazupon
1
960
CSC307 Lecture 06
javiergs
PRO
0
690
AIフル活用時代だからこそ学んでおきたい働き方の心得
shinoyu
0
130
LLM Observabilityによる 対話型音声AIアプリケーションの安定運用
gekko0114
2
430
ぼくの開発環境2026
yuzneri
0
230
AI Schema Enrichment for your Oracle AI Database
thatjeffsmith
0
280
Featured
See All Featured
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.1k
Stop Working from a Prison Cell
hatefulcrawdad
273
21k
Thoughts on Productivity
jonyablonski
74
5k
Building Applications with DynamoDB
mza
96
6.9k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
940
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
9.5k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
120
Ethics towards AI in product and experience design
skipperchong
2
190
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.8k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.6k
We Have a Design System, Now What?
morganepeng
54
8k
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