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
複雑性の高いオブジェクト編集に向き合う: プラガブルなReactフォーム設計
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
RightTouch
PRO
December 12, 2024
Technology
7
900
複雑性の高いオブジェクト編集に向き合う: プラガブルなReactフォーム設計
2024/12/12 ~Tech-Front Meetup~ 一歩先のフロントエンドへ 登壇資料
https://levtechcareer.connpass.com/event/337755/
RightTouch
PRO
December 12, 2024
Tweet
Share
More Decks by RightTouch
See All by RightTouch
<RightTouch>QANT VoC紹介資料 v.1.3
righttouch
PRO
0
2
<RightTouch>QANT Webエージェント 紹介資料 v1.2
righttouch
PRO
0
3
<RightTouch>QANTスピーク紹介資料 v.1.2
righttouch
PRO
0
6
日本社会の摩擦解消_AIとカスタマーサポート
righttouch
PRO
0
110
音声AIエージェント開発とプロダクトエンジニアチームの挑戦
righttouch
PRO
3
110
RightTouch_mind
righttouch
PRO
3
14k
プロダクト志向ってなんなんだろうね
righttouch
PRO
1
980
RightTouch Company Deck ver1.3
righttouch
PRO
6
39k
小規模組織のプロダクトエンジニアとして、アンラーニングしたこと
righttouch
PRO
4
940
Other Decks in Technology
See All in Technology
2人で作ったAIダッシュボードが、開発組織の次の一手を照らした話― Cursor × SpecKit × 可視化の実践 ― Qiita AI Summit
noalisaai
1
310
ファインディの横断SREがTakumi byGMOと取り組む、セキュリティと開発スピードの両立
rvirus0817
0
520
コスト削減から「セキュリティと利便性」を担うプラットフォームへ
sansantech
PRO
1
270
ファシリテーション勉強中 その場に何が求められるかを考えるようになるまで / 20260123 Naoki Takahashi
shift_evolve
PRO
3
410
Vitest Highlights in Angular
rainerhahnekamp
0
120
3分でわかる!新機能 AWS Transform custom
sato4mi
1
270
EventBridge API Destination × AgentCore Runtimeで実現するLambdaレスなイベント駆動エージェント
har1101
7
280
M&A 後の統合をどう進めるか ─ ナレッジワーク × Poetics が実践した組織とシステムの融合
kworkdev
PRO
0
120
JuliaTokaiとしてはこれが最後かもしれない(仮) for NGK2026S
antimon2
0
130
「AIでできますか?」から「Agentを作ってみました」へ ~「理論上わかる」と「やってみる」の隔たりを埋める方法
applism118
14
8.9k
Introduction to Bill One Development Engineer
sansan33
PRO
0
350
生成AI時代にこそ求められるSRE / SRE for Gen AI era
ymotongpoo
4
620
Featured
See All Featured
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.7k
Design in an AI World
tapps
0
140
A Modern Web Designer's Workflow
chriscoyier
698
190k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
61
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
260
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.1k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
160
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
48
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
170
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.9k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
0
100
Embracing the Ebb and Flow
colly
88
5k
Transcript
複雑性の高いオブジェクト編集に向き合う プラガブルな Reactフォーム設計 @2024/12/12 ~Tech-Front Meetup~ 一歩先のフロントエンドへ
1
© 2024 RightTouch Inc. アジェンダ 2 自己紹介・会社紹介
発表の目的と背景 フォーム実装の実際
© 2024 RightTouch Inc. 3 自己紹介 2020 東京大学理学系研究科博士課程修了
2020-2021 日立製作所 2021-2024 株式会社プレイド 2021-現在 株式会社RightTouch レーザー物理で博士号取得後、日立製作所で ITプラットフォームの設 計・開発に従事。 その後、プレイド/RightTouchで、テックリード/フルスタックエンジニア としてアプリケーション開発に従事。 好きなもの: 旬 齋藤 成之 X: @nakaakist
© 2024 RightTouch Inc. 会社紹介 沿革 2021年12月 株式会社RightTouch設立 2022年3月
次世代のコンタクトセンターを創ることに賛同いただいた お客様との実証実験を経て、 KARTE RightSupport(β版) をリリース 2023年10月 Webサイトとコールセンターの分断をなくし、問い合わせ体験を抜 本から変革する新プロダクト「 RightConnect by KARTE」β版を 提供開始 2023年10月 RightSupport by KARTEの正式版をリリース 主な導入企業様 設立:2021年12月 従業員:40名、うちエンジニア15名(2024年8月1日現在) 資本金:10,000,000円(資本準備金含む) RightTouch 4
© 2024 RightTouch Inc. アジェンダ 5 自己紹介・会社紹介
発表の目的と背景 フォーム実装の実際
© 2024 RightTouch Inc. フォームの複雑性 6 我々の取り組むBtoB SaaSでは特に、業務要件を反映した複雑なフォームが必要な場面がある
一方、世の中に出ている事例はそれほど多くないのでは ? →本発表では、我々のプロダクト事例から、一つのフォーム設計の形を提示できればと思っています シンプルなフォーム React-hook-formなどのライブラリ、または useState による管理で簡単に実装 複雑なフォーム 編集対象オブジェクト・画面の特性 により最適な設計を都度考える必要性 • 編集対象オブジェクトの深いネスト • 項目数の増加 • 動的に変化する編集項目 • 項目をまたぐバリデーション
© 2024 RightTouch Inc. RightTouchの具体例: サポートアクション 7 既存のお客様のWebサイトに、ノーコードで、パーソナライズされた
サポートコンテンツを埋め込むプロダクト
© 2024 RightTouch Inc. RightTouchの具体例: サポートアクションオブジェクト 8 サポートアクションを表現するオブジェクトは
型定義だけで46ファイルに上る、ネストと配列を含む複雑なもの。
© 2024 RightTouch Inc. RightTouchの具体例: サポートアクションオブジェクト 9 サポートアクションはパーツの組み合わせとして構成される。 各パーツには、それぞれ様々なタイプが存在。プロダクトの進化とともにタイプはどんどん増えていく
Module ⾒出し Module FAQ Transition 秒数経過 Transition エラー表⽰ Component コーチマーク … … … SupportAction 10秒経過 エラー表示 サポートアクションUI オブジェクト構造
© 2024 RightTouch Inc. RightTouchの具体例: サポートアクションエディタ 1 0 多数のパーツを
1画面で、リアルタイムプレ ビューつきで編集するフォーム 機能要件 • 動的に変化する編集項目 • 各パーツをまたぐバリデーション • 1画面に編集を収める 非機能要件 • パーツの種類が増加しても、保守性、開 発生産性を維持できる • パフォーマンスへの要求はそれほどシビ アではない
© 2024 RightTouch Inc. アジェンダ 1 1 自己紹介・会社紹介
発表の目的と背景 フォーム実装の実際
© 2024 RightTouch Inc. フォームライブラリ : React Hook Formの採用 1
2 編集対象オブジェクトのステート管理、バリデーションなどを一手に任せられる 生のuseStateなどの利用に比べ、コード量の大幅な削減が可能 ※類似のフォームライブラリもあるが、今後の安定性、複雑な型に対する適応力、我々の学習コスト等から今回は React Hook Formを採用 ref: https://zenn.dev/manalink_dev/articles/winter-react-form-mokumoku-meetup-report
© 2024 RightTouch Inc. フォームライブラリ : React Hook Formの採用 1
3 React Hook Formでは、オブジェクトの配列やネストといったある程度の複雑性への対処も可能 ドットでプロパティ名を繋ぐことにより、 ネストされたプロパティにアクセス可能
© 2024 RightTouch Inc. ステート管理の分岐点 1 4 パーツ パーツ
useForm 丸ごとステート管理 オブジェクト全体を1つのuseFormで丸ごとステート管理するか、パーツごとに細分化するか? → 関心事をなるべく分け、個々のステートをシンプルにするため 開発当初数ヶ月は細分化する方式を採用 パーツ パーツ useForm useForm パーツごとにステート単位を細分化
© 2024 RightTouch Inc. ステート細分化の弊害とリファクタ 1 5 要件の追加で別のパーツのデータやバリデーション結果を参照するニーズが増加。
異なるステート間を同期しあう苦しいコードが増える → オブジェクト全体を丸ごと一つの useFormでステート管理する方式に変更
© 2024 RightTouch Inc. オブジェクトを丸ごと React Hook Formでステート管理する際の課題 1
6 適切なReactコンポーネント分割 型安全性とパフォーマンス 2 1 ステートは一つだが、 Reactコンポーネントはパーツごとに分解 し、その中ではあたかも小規模なフォームを開発しているように したい 複雑なオブジェクトを React Hook Formで扱う場合、型計算に 限界が生じる部分がある。
© 2024 RightTouch Inc. コンポーネント分割 1 7 useFormContextでpropsの過度なバケツリレーを避けつつ、
パーツごとに独立してフォームを記述していき、 Reactコンポーネントを小さく保つ ※コードは簡略化したもの
© 2024 RightTouch Inc. 型の課題1 1 8 愚直にオブジェクト全体の型を useFormに入れると、型計算のコストがオブジェクトの複雑性に比例して増大
→ 部分的にTypeScriptのコンパイル限界を超えてしまうことも
© 2024 RightTouch Inc. 型の課題2 1 9 ユニオンを含むオブジェクト をuseFormの型パラメータに指定すると、
React Hook Formの仕様上、プロパティアクセスを型安全に扱うことが難しい ※コードは簡略化したもの
© 2024 RightTouch Inc. サブタイプの利用による型課題の解決 2 0 各パーツごとに、そのパーツ専用の軽量な SupportAction型のサブタイプを定義
useFormContextにはそれを渡すことで型計算のコストを低減、 スケール可能かつ型安全に サブタイプ サブタイプ ※コードは簡略化したもの
© 2024 RightTouch Inc. トレースの生成による型計算のボトルネック特定 2 1 tsc --generateTraceコマンドにより、tsコンパイル処理のトレースを取得
重い型計算がどこで行われているかを特定し、パフォーマンス改善を行う
© 2024 RightTouch Inc. この方針で実装した結果 2 2 施策 good
施策 more • フォーム内でのデータの取り回しを簡便に⾏いつつ、Reactコンポーネントはモジュール 化し型安全に、という⽬論⾒は達成できている • 8ヵ⽉程度運⽤し、パーツの種類の追加も⼤きな問題なくスムーズに⾏えている • React Hook Formで巨⼤なオブジェクトを扱うにあたって、細かいライブラリのバグを踏 むこともあった(※) ※ https://github.com/react-hook-form/react-hook-form/issues/11937
© 2024 RightTouch Inc. まとめ 2 3 • 複雑なオブジェクトのフォーム作成における設計事例を紹介 ◦
React Hook Formに⼯夫を加え、オブジェクト全体を管理させることで、バリデーションやステート 管理をライブラリに任せつつ、プラガブルにパーツを⾜していけるフォームを実装 ◦ 課題もまだあるものの、安定的に運⽤できている • 複雑なフォームであっても、なるべくシンプルな状態(=1ステートで丸ごと管理)から始めて、徐々に分割を 検討する⽅針の⽅が結果的には良かった • 今回のような⽅針はハマるケースとそうでないケースがある。下記要件によって⾒極める必要がある ◦ パーツ間のフォームの独⽴性 ◦ バリデーションの要件 ◦ フォームsubmitの形式とタイミング(e.g., ウィザード形式か1画⾯か)
24