最終更新日: 2023年08月15日

コンポーザブル ディレクトリ

Nuxt 3では、composables/ディレクトリを使用して、Vueのコンポーザブルを自動的にアプリケーションにインポートします。これは、自動的なインポートを利用しています。

裏側では、Nuxtは .nuxt/imports.d.ts というファイルを自動生成して型を宣言します。

Nuxtが型を生成するためには、nuxi prepare、nuxi dev、またはnuxi buildを実行する必要があることに注意してください。開発サーバーを起動せずにコンポーザブルを作成すると、TypeScriptが 'useBar' という名前が見つからないなどのエラーをスローします。

使用方法

方法1: 名前付きエクスポートを使用する

  • composables/useFoo.ts
  • ts
export const useFoo = () => {
  return useState("foo", () => "bar");
};

方法2: デフォルトエクスポートを使用する

  • composables/useFoo.ts
  • ts
// useFoo()として利用可能になります(拡張子を除いたファイル名のキャメルケース)
export default function () {
  return useState("foo", () => "bar");
}

使用方法: 現在、.js、.ts、および.vueファイルで自動的にインポートされたコンポーザブルを使用できます。

  • app.vue
  • ts
<script setup lang="ts">
  const foo = useFoo()
</script>

<template>
  <div>
    {{ foo }}
  </div>
</template>

事例

ネストされたコンポーザブル

自動インポートを使用して、別のコンポーザブル内でコンポーザブルを使用することができます:

  • composables/test.ts
  • ts
export const useFoo = () => {
  const nuxtApp = useNuxtApp();
  const bar = useBar();
};

プラグインのインジェクションにアクセスする

コンポーザブルからプラグインのインジェクションにアクセスできます:

  • app.vue
  • ts
export const useHello = () => {
  const nuxtApp = useNuxtApp();
  return nuxtApp.$hello;
};

ファイルのスキャンについて

Nuxtはcomposables/ディレクトリのトップレベルのファイルのみをスキャンします。例えば、次のようなファイルです:

  • app.vue
  • ts
composables
 | - index.ts // ○ スキャン
 | - useFoo.ts // ○ スキャン
 | - nested // *フォルダ
 | --- utils.ts // × スキャンされない

composables/index.ts と composables/useFoo.ts のみがインポートの対象となります。

ネストされたモジュールに対して自動インポートを機能させるには、それらを再エクスポート(推奨)するか、あるいはスキャナーを設定してネストされたディレクトリを含めることができます。

例: composables/index.ts ファイルから必要なコンポーザブルを再エクスポートする方法:

  • app.vue
  • ts
// このエクスポートに対して自動インポートを有効にします
export {utils} from "./nested/utils.ts";

例: composables/フォルダ内のネストされたディレクトリをスキャンする方法:

  • nuxt.config.ts
  • ts
export default defineNuxtConfig({
  imports: {
    dirs: [
      // トップレベルのモジュールをスキャン
      "composables",
      // ある特定の名前とファイル拡張子を持つ、ネストされたモジュールをスキャン
      "composables/*/index.{ts,js,mjs,mts}",
      // 指定されたディレクトリ内のすべてのモジュールをスキャン
      "composables/**",
    ],
  },
});