フロントのコンポーネント設計ベストプラクティスを探してみた話

3 min read読了の目安(約2900字

コンポーネントの設計方法って 「大体の場合はこのやり方で設計したら勝手に良い感じになるから!」 みたいなベストプラクティスは無いのか気になった(楽して設計したい)

私は React をメインで使用していますが、コンポーネント設計の話なので Vue メインの方でも読んでいただけると思います。
サンプルや参考記事は React ベース・Vue ベースどちらも出てきます。

また、この記事ではコンポーネントの分割方法のみに注目しており、コンポーネントのスタイルや状態保持の設計については基本的に言及しません。
それらの内容についてはこちらの記事が大変参考になりますのでオススメです。

ベストプラクティス

私は楽をするためならどんなに苦労しても構わない人間なのでそれなりに時間をかけて調べましたが、見つかりませんでした(良い設計は作るものによりますよね)。
しかしヒントになる情報や勉強になる事例も見つけたので記事にします。

React の流儀

React 公式がデザインモックを React コンポーネントに落とし込む流れを公開してます。

https://ja.reactjs.org/docs/thinking-in-react.html
オフィシャルが提示している間違いの無いやり方です(ベストプラクティスと言って良いのかも)。
ただサンプルコンポーネントの規模が小さめなので、このページを見て実務で通用するコンポーネント設計ができるかと言われると微妙なところです(実際には hooks や ContainerComponent の思想も出てくることが多いので)。
書いてる内容自体はわかりやすく大変素晴らしいので、読んだことない方は是非。

Virtual Event Starter Kit

Next.js Conf2020 はオンライン開催となったのですが、そのイベントページを Next.js 開発元である Vercel が作成してソースコードを公開しています。

https://github.com/vercel/virtual-event-starter-kit
当然ですが Next.js を使用しており、CMS との連携もあったりと結構多機能です。
React のプロ集団が作ったソースで内容も素晴らしく、コンポーネント設計を考える上でも大変参考になります。
ちなみにAtomicDesign(後述)は採用されてないです

AtomicDesign


画像引用元

フロント設計におけるデファクトスタンダードと言えるAtomicDesignですが、これをそのままコンポーネント設計に適用しようとすると色々苦労します。
(AtomicDesign についての分かりやすい記事はこちら)

でも Web アプリを AtomicDesign で構成する記事はよく見るし、良さそうな話もたくさん聞きます。
私が React 初学者の頃に読んだ技術書でも推奨されてました。

AtomicDesign はコンポーネント設計思想ではなく、デザインの設計思想

AtomicDesign はデザインシステムの話です。それをそっくりそのまま React、Vue のコンポーネントシステムに適用すると色々不都合が出てきます。

  • Atoms に分割しようと思えばできるけど再利用性は皆無な場合
  • これは Molecules?Organisms?どれでもない?単位がよくわからない場合
  • データを pages から流そうとするとデータ取得部がとんでもなく FAT になる場合


コンポーネント指向の大きなメリット(目的)である

  • 再利用性の担保
  • メンテナンス性の担保

この2点はコンポーネント設計を行う上で常に意識するべきです。
そして意識すればするほど AtomicDesign がコンポーネント設計にハマらなくなっていくことが多いです
多くの方が一度通る道なのではないでしょうか。

みんなどうしてるの?

優秀な方達は皆 AtomicDesign に独自の構造・仕組みを加えてコンポーネント設計にうまくフィットさせているようです。
下記で Airbnb など大企業の事例が簡単に紹介されており面白いです。

https://logmi.jp/tech/articles/300657

国内の事例でも大変勉強になるものがありましたのでリンクを貼っておきます。

https://devblog.thebase.in/entry/2019/11/27/110000
https://mya-ake.com/posts/component-design-based-on-atomic-design/

大切なのは AtomicDesign のエッセンスを上手にコンポーネント設計に取り入れることみたいです。
脳死で AtomicDesign の思想通りにコンポーネント設計を行うと苦労します(私)。

AtomicComponents

簡単に言うと AtomicDesign の考え方を Web アプリ開発に向けて派生させたもの。
下記は原文の日本語訳ですが、現在原文本体は削除されており読むことができないようです(何故…)。

https://qiita.com/kahirokunn/items/b599d2cf04d2580c412c

私は今回色々調べる中で初めて知りましたが、2015 年の jsconf で発表されていたそうです。
ベストプラクティスになり得る…?一度試してみたいところです。

終わりに

結局は作るものによって最適な設計は変わるので、ベストプラクティスは存在しない、というのが現状の答えでしょうか。
AtomicComponents については一度試してみたいと思っており、その際にはまた記事にします。

読んでいただきありがとうございました。