Slide 1

Slide 1 text

Aiji Uejima @aiji42 React プロジェクトに 秩序をもたらす React Night #1

Slide 2

Slide 2 text

Hello! I Am 上島 愛史 うえじま あいじ

Slide 3

Slide 3 text

プライベートで毎日触るくらい React が大好きです

Slide 4

Slide 4 text

一方業務では React に対する ネガティブな面も見ている

Slide 5

Slide 5 text

“React プロジェクトは          カオスになりやすい” “

Slide 6

Slide 6 text

ディレクトリルールがない 要因① カオスになりやすい

Slide 7

Slide 7 text

引用: https://ja.reactjs.org/docs/faq-structure.html 公式ドキュメントによると

Slide 8

Slide 8 text

引用: https://ja.reactjs.org/docs/faq-structure.html 公式ドキュメントによると

Slide 9

Slide 9 text

Proof of Concept Build and Scrap の思想が強い

Slide 10

Slide 10 text

デザインとロジックが 交錯しがち 要因② カオスになりやすい

Slide 11

Slide 11 text

コンポーネント内にデータ取 得の処理が書かれたり ビジネスに関する知識を 密に持ってしまったり

Slide 12

Slide 12 text

どれだけレビューで打ち返したり ディレクトリルールで縛っても 規模拡大に応じて結合も増えていく

Slide 13

Slide 13 text

引用: https://medium.com/javascript-in-plain-english/react-vue-and-business-logic-19df105698a2

Slide 14

Slide 14 text

テスト容易性・変更容易性の 低下を招いている

Slide 15

Slide 15 text

React の問題というより “フロントエンド”領域の 宿命なのかもしれない (Facebook や Vercel の動向に期待)

Slide 16

Slide 16 text

書き方・構成の統制がないと スキル差が保守性低下に直結しやすい まとめると

Slide 17

Slide 17 text

“React プロジェクトは          カオスになりやすい” “

Slide 18

Slide 18 text

ここまでを踏まえて

Slide 19

Slide 19 text

私が実際に行った カオスを排除し 秩序を保つ仕組みと それを支えるツールに について発表

Slide 20

Slide 20 text

解決策は2つ

Slide 21

Slide 21 text

monorepo scaffold 誰もが同一構成で 書き始める仕掛け作りで スキルギャップを吸収 とビジネスロジック の世界を分けることで 物理的に知識を分離する Solution 1 2

Slide 22

Slide 22 text

monorepo scaffold 誰もが同一構成で 書き始める仕掛け作りで スキルギャップを吸収 とビジネスロジック の世界を分けることで 物理的に知識を分離する Solution 1 2

Slide 23

Slide 23 text

Single repo UI UI UI UI UI Logic Logic Logic Logic カオスなリポジトリ UIとロジックが密結合している テストしづらい 全員が同時に同一リポジトリで 開発を行う

Slide 24

Slide 24 text

Logic repo UI UI UI UI UI Logic Logic Logic Logic Logic UI repo 解決へのアプローチ リポジトリを分けて物理的に分離し 互いの知識を共有しない

Slide 25

Slide 25 text

Logic repo UI UI UI UI UI Logic Logic Logic Logic Logic UI repo 分業を可能にし テスタビリティも向上する

Slide 26

Slide 26 text

Logic repo UI UI UI UI UI Logic Logic Logic Logic Logic UI repo ビルドしたものを互いに レジストリにパブリッシュ

Slide 27

Slide 27 text

Business repo Logic packages UI packages Logic UI Logic UI Logic UI ビジネス用のリポジトリで初めて コレボレーションし結合する

Slide 28

Slide 28 text

Business repo Logic packages UI packages Logic UI Logic UI Logic UI ロジックを分離したことで デザインの再利用もできる UI UI Other repos

Slide 29

Slide 29 text

PROS デザイナー コーダー の参画のハードルが下がる リポジトリを分断することで、知識が混ざらない そうすることでテスト容易性が生まれる ・ は でビジュアルテストを、 は によるユニットテストを 他のプロジェクトからもデザインの再利用が可能

Slide 30

Slide 30 text

CONS 組織も合わせて形を変えないと不健全な状態になるコンウェイ 最終的なビジネスコンポーネントに結合するまで、 ビジネスの要求に応えられているかの品質が保証できない 最終的にリリースまでのリードタイムが長くなる

Slide 31

Slide 31 text

CONS 組織も合わせて形を変えないと不健全な状態になるコンウェイ 最終的なビジネスコンポーネントに結合するまで、 ビジネスの要求に応えられているかの品質が保証できない 最終的にリリースまでのリードタイムが長くなる モノレポを採用して 問題を解消する

Slide 32

Slide 32 text

引用: https://blog.spacemarket.com/code/web-frontend-repository-composition-monorepo-or-manyrepo/

Slide 33

Slide 33 text

Mono repo Logic repo UI repo Business repo すべてのリポジトリを一つの リポジトリ内で管理 分業方法は変わらない

Slide 34

Slide 34 text

Mono repo Logic repo UI repo Business repo Developing dependency ローカルでの開発中は リンクでリポジトリ間の 依存解決が行われる (yarn workspace / Lerna) リアルタイムでパッケージの 変更と組込みを同時に行える

Slide 35

Slide 35 text

Mono repo Logic repo UI repo Business repo Released dependency Other repos リリース時には レジストリ経由での 依存解決に切り替わる

Slide 36

Slide 36 text

実際に採用している構成 /ui /api /hooks /utils /core U L L L B BFFとの通信 カスタムフック (コンポーネントからAPIリクエストを隠蔽する ) 便利な共通関数 デザイン ビジネスドメイン

Slide 37

Slide 37 text

実際に採用している構成 /ui /api /hooks /utils /core U L L L B BFFとの通信 カスタムフック (コンポーネントからAPIリクエストを隠蔽する ) 便利な共通関数 デザイン ビジネスドメイン ツールを利用し破綻を防いでいる

Slide 38

Slide 38 text

モノレポ戦略を 支援するツール

Slide 39

Slide 39 text

モノレポマネジメントを フレームワーク的 アプローチで行えるようにす るツール https://lerna.js.org/

Slide 40

Slide 40 text

を採用 すると、 を自動生 成してくれる 自動CHANGELOG を採用すると、 パブリッシュ時のバージョン を自動的に選択 してくれる 自動バージョニング ローカルではシンボリックリン クによりリポジトリ間を参照して くれるため、変更を即時反映し てくれる 依存関係の解決 テスト、ビルド、開発サーバ立 ち上げなど、各リポジトリのコ マンドを一斉実行可能 依存関係を解釈し、実行順序 を自動的判断してくれる コマンド一斉実行 や 、 な ど、どのリポジトリでも使用す るものは、共通化できるため、 バージョン管理が楽 パッケージの共有 Introduce Lerna

Slide 41

Slide 41 text

https://qiita.com/kimamula/items/0b 4dff363933bfe74506 https://qiita.com/hisasann/items/929 b6702df1d6e871ce7 詳しく知りたい方はこちらをどうぞ

Slide 42

Slide 42 text

Lernaを利用しモノレポ戦略で 物理的にUIとロジックを 混ぜない仕組みを作った 1 Conclude

Slide 43

Slide 43 text

monorepo scaffold 誰もが同一構成で 書き始める仕掛け作りで スキルギャップを吸収 とビジネスロジック の世界を分けることで 物理的に知識を分離する Solution 1 2

Slide 44

Slide 44 text

コンポーネントを作成する際 手順や考えるべきことが多い 処理をカスタムフックにする ノーマルの関数で書く 依存処理をコンポーネントファイル内に書く ファイルを分ける ファイル、 ファイルを書く 書かない えとせとら えとせとら の型定義を する しない

Slide 45

Slide 45 text

Rails には scaffold という 必要なファイルを用意してくれる コマンドがある

Slide 46

Slide 46 text

React にも Scaffoldを 採用しよう

Slide 47

Slide 47 text

https://zenn.dev/takepepe/articles/hygen -template-generator https://qiita.com/usagi-f/items/ea4ecf7ec6a 6b52567e3 記事を参考に React 版 scaffold を作成

Slide 48

Slide 48 text

対話的にコンポーネントの構 成ファイルを自動生成できる ツール Hygen http://www.hygen.io/

Slide 49

Slide 49 text

Introduce Hygen テンプレートの内容はチーム内で カスタマイズして登録して使う テンプレート内に や のファ イルも設置できる ディレクトリを分けて複数パターン 登録可能

Slide 50

Slide 50 text

DEMO

Slide 51

Slide 51 text

Hygenを利用し自動的に 高品質な状態から 開発着手できるようにした 2 Conclude

Slide 52

Slide 52 text

monorepo scaffold 誰もが同一構成で 書き始める仕掛け作りで スキルギャップを吸収 とビジネスロジック の世界を分けることで 物理的に知識を分離する Solution 1 2

Slide 53

Slide 53 text

Lernaを利用しモノレポ戦略で 物理的にUIとロジックを 混ぜない仕組みを作った 1 Conclude

Slide 54

Slide 54 text

Hygenを利用し自動的に 高品質な状態から 開発着手できるようにした 2 Conclude

Slide 55

Slide 55 text

Any questions? Thanks!