Upgrade to Pro — share decks privately, control downloads, hide ads and more …

フロントエンド開発における設計のお話

Avatar for Duck Duck
November 25, 2023

 フロントエンド開発における設計のお話

フロントエンド開発における設計の大切さとコンポーネント設計の具体例の一部を紹介します!

Avatar for Duck

Duck

November 25, 2023
Tweet

Other Decks in Programming

Transcript

  1. 自己紹介 職種 Software Engineer / Engineer Maganer 経歴 SIer (5年)

    → SaaS提供会社 (3年) + 業務委託 趣味 バンド活動 (ベース) / ロードバイク X @engine_duck Daiki Endo ( Duck )
  2. フロントエンドが責務を担う関心毎が増えた • ページルーティング • Model (外部データ) の状態 (キャッシュ等) • 見た目をどう表示するのかの状態

    • DOMの値 (refオブジェクト) • 認証 / 認可 管理 etc. SSRやRSC (React Server Component) でも、 SeverでフェッチするかClientでフェッチするかの違いで、 フロントエンド (React) が管理することには変わらない。 Client Server Web API JS ( React / Vue ) React / Vue 等のモダンフロントエンドの関心事
  3. フロントエンド開発での関心毎が増えているので、コードが複雑になりやすい。 Next / Nuxt を使えば、React / Vue が提供する複雑な機能を便利に使えるが、 これだけではコードの保守性と可読性がすごく高まる訳ではない。 バックエンド開発では、

    MVCモデルやSOLID原則、クリーンアーキテクチャを用いたクラス設計など、 責務/依存を意識してコードを書いていく流れがあるが、 フロントエンド開発では、ライブラリやFWは何を使うかはよく議論されているが、 設計についてはあまり言及されていない (?) 知られていない ( ? ) ※ Atomic Designはかなり有名。 『フロントエンドのデザインパターン』https://zenn.dev/morinokami/books/learning-patterns-1 ⇦ オススメです! React / Vue ( 宣言的UIライブラリ ) が普及したのも日本ではここ数年なので、 有識者がまだ多くないことも背景にある (?) フロントエンド開発の設計手法は意外と知られていない?
  4. UI表示のみに関心を持つViewコンポーネント 受け取ったデータをどう表示するかに 関心を持つコンポーネント Model コンポーネント Model (外部データ)に関心を持つンポーネント Fetcher Hooks (SWR等)

    をサブスクライブするコンポーネント データロードするサーバーコンポーネント Viewコンポーネントをハンドリングする Controllerコンポーネント 外部データをどのViewコンポーネントに 任せるのかに関心を持つコンポーネント Controller コンポーネント View コンポーネント View コンポーネント MVC指向で考えるコンポーネント設計
  5. Organisms ( Container ) / Template ・特定のプロダクトに依存しない  ( = 他アプリケーションでも使用可能

    ) ・外部モジュール化できる ・UI表示のためのLocal Stateは持つことはある Molecules Atom Atom Atom Organisms ( Presentational ) Molecules Atom Atom Molecules Atom Atom Organisms ( Presentational ) Molecules Atom Atom Molecules Atom Atom Atomic Designを基に考えるコンポーネント設計 ・業務ロジックは持たない ・プロダクト毎に設計 採用ライブラリやプロダクトによって 考え方は変わります! ・ドメインに関心を持つ ・業務ロジックを持つ ・外部データへのアクセスがある
  6. 保守性と可読性を高める工夫やお話したいことは、他にもたくさんあります! • ディレクトリ設計 / スタイリング設計 / テスト設計 • Global State

    を扱うhooksをサブスクライブするコンポーネントの区分 • 循環参照が起きないような工夫 • コンポーネントにおけるProps定義の大切さ ◦ コンポーネント名とProps名でどのようなコンポーネントか分かるように ◦ Propsは関心事として捉える ◦ PropsはなるべくHTMLに沿うようにする ◦ Slot ( ReactElement)で渡すことを意識する その他の開発時の設計およびポイント その他の開発時の設計およびポイント