NuxtJSとの併用
NuxtJSプロジェクトでFSDを実装することは可能ですが、NuxtJSのプロジェクト構造要件とFSDの原則の違いにより、以下の2点でコンフリクトが発生してしまいます。
- NuxtJSは
srcフォルダーなしでプロジェクトのファイル構造を提供している。つまり、ファイル構造がプロジェクトのルートに配置される。 - ファイルルーティングは
pagesフォルダーにあるが、FSDではこのフォルダーはフラットなスライス構造に割り当てられている。
srcディレクトリのエイリアスを追加する
Section titled “srcディレクトリのエイリアスを追加する”設定ファイルにaliasオブジェクトを追加します。
export default defineNuxtConfig({ devtools: { enabled: true }, // FSDには関係なく、プロジェクト起動時に有効 alias: { "@": '../src' },})ルーター設定方法の選択
Section titled “ルーター設定方法の選択”NuxtJSには、コンフィグを使用する方法とファイル構造を使用する方法の2つのルーティング設定方法があります。
ファイルベースのルーティングの場合、app/routesディレクトリ内にindex.vueファイルを作成します。一方、コンフィグを使用する場合は、router.options.tsファイルでルートを設定します。
コンフィグによるルーティング
Section titled “コンフィグによるルーティング”app層にrouter.options.tsファイルを作成し、設定オブジェクトをエクスポートします。
import type { RouterConfig } from '@nuxt/schema';
export default <RouterConfig> { routes: (_routes) => [],};プロジェクトにホームページを追加するには、次の手順を行います。
pages層内にページスライスを追加するapp/router.config.tsのコンフィグに適切なルートを追加する
ページスライスを作成するには、CLIを使用します。
fsd pages homehome-page.vueファイルをuiセグメント内に作成し、公開APIを介してアクセスできるようにします。
export { default as HomePage } from './ui/home-page';このように、ファイル構造は次のようになります。
ディレクトリsrc/
ディレクトリapp/
- router.config.ts
ディレクトリpages/
ディレクトリhome/
ディレクトリui/
- home-page.vue
- index.ts
最後に、ルートをコンフィグに追加します。
import type { RouterConfig } from '@nuxt/schema'
export default <RouterConfig> { routes: (_routes) => [ { name: 'home', path: '/', component: () => import('@/pages/home.vue').then(r => r.default || r) } ],}ファイルルーティング
Section titled “ファイルルーティング”まず、プロジェクトのルートにsrcディレクトリを作成し、その中にapp層とpages層のレイヤー、app層内にroutesフォルダーを作成します。
このように、ファイル構造は次のようになります。
ディレクトリsrc/
ディレクトリapp/
ディレクトリroutes/
- …
ディレクトリpages/ FSDに割り当てられたpagesフォルダー
- …
NuxtJSがapp層内のroutesフォルダーをファイルルーティングに使用するには、nuxt.config.tsを次のように変更します。
export default defineNuxtConfig({ devtools: { enabled: true }, // FSDには関係なく、プロジェクト起動時に有効 alias: { "@": '../src' }, dir: { pages: './src/app/routes' }})これで、app層内のページに対してルートを作成し、pages層からページを接続できます。
例えば、プロジェクトにHomeページを追加するには、次の手順を行います。
pages層内にページスライスを追加するapp層内に適切なルートを追加する- スライスのページをルートに接続する
ページスライスを作成するには、CLIを使用します。
fsd pages homehome-page.vueファイルをuiセグメント内に作成し、公開APIを介してアクセスできるようにします。
export { default as HomePage } from './ui/home-page';このページのルートをapp層内に作成します。
ディレクトリsrc/
ディレクトリapp/
ディレクトリroutes/
- index.vue
ディレクトリpages/
ディレクトリhome/
ディレクトリui/
- home-page.vue
- index.ts
index.vueファイル内にページコンポーネントを追加します。
<script setup> import { HomePage } from '@/pages/home';</script>
<template> <HomePage/></template>layoutsについて
Section titled “layoutsについて”layoutsはapp層内に配置できます。そのためには、コンフィグを次のように変更します。
export default defineNuxtConfig({ devtools: { enabled: true }, // FSDには関係なく、プロジェクト起動時に有効 alias: { "@": '../src' }, dir: { pages: './src/app/routes', layouts: './src/app/layouts' }})