なんでこんな記事書いたか
社内ではFEとBEの間をウロチョロしていて、
そこまでhtmlコーディングをしない私。
社内のガチFEさんたちがhtmlで静的ファイルを作る場合は
FLOCSSが多く、んじゃあ今後Nuxtのコーディングルールもそっちに合わせよか
とやり出してはみたものの、まったくしっくりいかず。
やはり思想的には個人的にAtomicDesignのほうがしっくりくるので、
AtomicDesignと柴犬でもわかるFLOCSSを読み直しながら
相互対応表を作り、今後他のエンジニアがNuxtプロジェクトに関わるときに
コンポーネント設計に迷いが出ないようにしようとおもったわけですさ。
FLOCSSかAtomicDesignか
Nuxtにおけるコンポーネント設計におけるディレクトリ構造が
FLOCSSよりはAtomicDesignの方がシンプルかつわかりやすいもの
であるため、今後Nuxt.jsにおける開発に限っては、
AtomicDesignの思想でコンポーネントを分類する方が良いと感じている。
└── nuxt-sample //プロジェクトディレクトリ
├── nuxt.config.js
├── src
│ ├── assets
│ ├── components
│ │ ├── atoms
│ │ ├── molecules
│ │ ├── organisms
│ │ └── templates
│ ├── layouts
│ ├── pages
│ ├── plugins
│ ├── static
│ ├── store
│ └── types
├── storybook
└── test
理由
Nuxt.jsの基本ディレクトリは以下のようになっている。
└── src
├── assets
├── components
├── layouts
└── pages
そこに、FLOCSSのディレクトリ基準を当て込むと以下のような状態になる。
└── src
├── assets //元からあるディレクトリ
├── components //元からあるディレクトリ
│ ├── layout
│ └── object
│ ├── component
│ ├── project
│ └── utility
├── layouts //元からあるディレクトリ
└── pages //元からあるディレクトリ
この状態だと、layoutが複数あったり、pagesとprojectの違いが分かりづらいなどの問題が発生する。
対策、FLOCSSからAtomicDesignsに乗り換える場合の分類目安
FLOCSS | AtomicDesign | 備考 |
---|---|---|
Foundation | assets/css | scssとして用意し、あらかじめロードする。 |
Object/Utility | 該当なし | Tailwind CSSで代用する。Tailwind CSSを利用しない場合は、scssファイルにまとめた上で、assets/cssに格納する。 |
Object/Componentのなかでもより原始的なもの | component/atoms | h2やbuttonなどのよりプリミティブなコンポーネント。他のコンポーネントに依存することがあってはならない。 |
Object/ComponentのなかでもComponentを含むもの | component/molecules | atomsが複数連なってなるコンポーネント。独立したコンポーネントというよりは、OrganismsやLayout内の一要素となるもの。 |
Object/Project | component/organisms | moleculesやatomsを含む、プロジェクト固有のパターンであり、汎用性が低いもの。 |
Layout | component/templates | 大小問わず、レイアウトテンプレートは全てここに格納する。 |
該当なし | pages | ページのルーティング。 |
└── nuxt-sample //プロジェクトディレクトリ
├── nuxt.config.js
├── src
│ ├── assets
│ │ └── css //Foundation
│ ├── components
│ │ ├── atoms //Object/Component
│ │ ├── molecules //Object/Component
│ │ ├── organisms //Object/Project
│ │ └── templates //Layout
│ ├── layouts
│ ├── pages
│ ├── plugins
│ ├── static
│ ├── store
│ └── types
├── storybook
└── test