コンポーネント
Nuxt Kit は、コンポーネントを扱うための一連のユーティリティを提供します。コンポーネントをグローバルまたはローカルに登録したり、コンポーネントをスキャンするディレクトリを追加したりできます。
コンポーネントは、Nuxt アプリケーションの構成要素です。再利用可能な Vue インスタンスであり、ユーザーインターフェースを作成するために使用できます。Nuxt では、components ディレクトリからのコンポーネントがデフォルトで自動的にインポートされます。しかし、別のディレクトリからコンポーネントをインポートする必要がある場合や、必要に応じて選択的にインポートしたい場合、@nuxt/kit は addComponentsDir と addComponent メソッドを提供します。これらのユーティリティを使用すると、ニーズに合わせてコンポーネントの設定をカスタマイズできます。
コンポーネントの注入に関する Vue School のビデオを視聴してください。
addComponentsDir
コンポーネントをスキャンして使用時にのみインポートされるディレクトリを登録します。global: true オプションを指定しない限り、これによりコンポーネントがグローバルに登録されることはありません。
使用法
export default defineNuxtModule({
meta: {
name: '@nuxt/ui',
configKey: 'ui',
},
setup() {
addComponentsDir({
path: resolve('./runtime/components'),
prefix: 'U',
pathPrefix: false
})
}
})
型
function addComponentsDir (dir: ComponentsDir, opts: { prepend?: boolean } = {}): void
パラメータ
dir 次のプロパティを持つオブジェクト:
| プロパティ | 型 | 必須 | 説明 |
|---|---|---|---|
path | string | true | コンポーネントを含むディレクトリへのパス(絶対または相対)。プロジェクト内のディレクトリを参照するために Nuxt エイリアス(~ または @)を使用したり、require に似た npm パッケージパスを直接使用できます。 |
pattern | string | string[]{lang="ts"} | false | 指定されたパスに対して実行されるパターンを受け入れます。 |
ignore | string[] | false | 指定されたパスに対して実行される無視パターン。 |
prefix | string | false | この文字列で一致するすべてのコンポーネントにプレフィックスを付けます。 |
pathPrefix | boolean | false | コンポーネント名にそのパスをプレフィックスとして付けます。 |
enabled | boolean | false | true に設定すると、このディレクトリのスキャンを無視します。 |
prefetch | boolean | false | これらのプロパティ(prefetch/preload)は、Lazy プレフィックスを持つコンポーネントが webpack のマジックコメントによってどのように処理されるかを設定するために本番環境で使用されます。詳細は webpack ドキュメント を参照してください。 |
preload | boolean | false | これらのプロパティ(prefetch/preload)は、Lazy プレフィックスを持つコンポーネントが webpack のマジックコメントによってどのように処理されるかを設定するために本番環境で使用されます。詳細は webpack ドキュメント を参照してください。 |
isAsync | boolean | false | このフラグは、Lazy プレフィックスを使用するかどうかに関係なく、コンポーネントを非同期で(別のチャンクで)ロードする必要があることを示します。 |
extendComponent | (component: Component) => Promise<Component | void> | (Component | void){lang="ts"} | false | ディレクトリ内で見つかった各コンポーネントに対して呼び出される関数です。コンポーネントオブジェクトを受け取り、コンポーネントオブジェクトまたはコンポーネントオブジェクトに解決されるプロミスを返す必要があります。 |
global | boolean | false | 有効にすると、コンポーネントがグローバルに利用可能になるように登録されます。 |
island | boolean | false | 有効にすると、コンポーネントがアイランドとして登録されます。アイランドについての詳細は <NuxtIsland/> コンポーネントの説明を参照してください。 |
watch | boolean | false | ファイルの追加や削除を含む、指定されたパスの変更を監視します。 |
extensions | string[] | false | Nuxt ビルダーがサポートする拡張子。 |
transpile | 'auto' | boolean{lang="ts"} | false | build.transpile を使用して指定されたパスをトランスパイルします。'auto' に設定すると、パスに node_modules/ が含まれている場合に transpile: true が設定されます。 |
opts
| プロパティ | 型 | 必須 | 説明 |
|---|---|---|---|
prepend | boolean | false | true に設定すると、ディレクトリは push() の代わりに unshift() を使用して配列に追加されます。 |
addComponent
コンポーネントを自動的にインポートするように登録します。
使用法
import { defineNuxtModule, createResolver, addComponent } from '@nuxt/kit'
export default defineNuxtModule({
meta: {
name: '@nuxt/image',
configKey: 'image',
},
async setup() {
const resolver = createResolver(import.meta.url)
addComponent({
name: 'NuxtImg',
filePath: resolver.resolve('./runtime/components/NuxtImg.vue'),
})
addComponent({
name: 'NuxtPicture',
filePath: resolver.resolve('./runtime/components/NuxtPicture.vue'),
})
},
})
型
function addComponent (options: AddComponentOptions): void
パラメータ
options: 次のプロパティを持つオブジェクト:
| プロパティ | 型 | 必須 | 説明 |
|---|---|---|---|
name | string | true | コンポーネント名。 |
filePath | string | true | コンポーネントへのパス。 |
pascalName | string | false | パスカルケースのコンポーネント名。指定しない場合、コンポーネント名から生成されます。 |
kebabName | string | false | ケバブケースのコンポーネント名。指定しない場合、コンポーネント名から生成されます。 |
export | string | false | 名前付きまたはデフォルトのエクスポートを指定します。指定しない場合、'default' に設定されます。 |
shortPath | string | false | コンポーネントへの短いパス。指定しない場合、コンポーネントパスから生成されます。 |
chunkName | string | false | コンポーネントのチャンク名。指定しない場合、コンポーネント名から生成されます。 |
prefetch | boolean | false | これらのプロパティ(prefetch/preload)は、Lazy プレフィックスを持つコンポーネントが webpack のマジックコメントによってどのように処理されるかを設定するために本番環境で使用されます。詳細は webpack ドキュメント を参照してください。 |
preload | boolean | false | これらのプロパティ(prefetch/preload)は、Lazy プレフィックスを持つコンポーネントが webpack のマジックコメントによってどのように処理されるかを設定するために本番環境で使用されます。詳細は webpack ドキュメント を参照してください。 |
global | boolean | false | 有効にすると、コンポーネントがグローバルに利用可能になるように登録されます。 |
island | boolean | false | 有効にすると、コンポーネントがアイランドとして登録されます。アイランドについての詳細は <NuxtIsland/> コンポーネントの説明を参照してください。 |
mode | 'client' | 'server' | 'all'{lang="ts"} | false | このオプションは、コンポーネントがクライアント、サーバー、またはその両方でレンダリングされるべきかを示します。デフォルトでは、クライアントとサーバーの両方でレンダリングされます。 |
priority | number | false | コンポーネントの優先度。同じ名前のコンポーネントが複数ある場合、最も高い優先度のものが使用されます。 |
例
npm パッケージからコンポーネントを自動インポートしたい場合、コンポーネントがデフォルトではなく名前付きエクスポートである場合、export オプションを使用して指定できます。
import { addComponent, defineNuxtModule } from '@nuxt/kit'
export default defineNuxtModule({
setup () {
// import { MyComponent as MyAutoImportedComponent } from 'my-npm-package'
addComponent({
name: 'MyAutoImportedComponent',
export: 'MyComponent',
filePath: 'my-npm-package',
})
},
})
tips
このセクションは公式ドキュメントの翻訳ではなく、本サイト独自の補足記事です。
Nuxtのコンポーネント登録機能とは?〜開発効率化の鍵〜
NuxtはVueベースのフレームワークとして、コンポーネントを簡単に扱える仕組みを備えています。特にcomponentsディレクトリ内のコンポーネントは自動的にインポートされるため、手動でimport文を書く手間が省けます。
しかし、プロジェクトが大規模化したり、外部パッケージや独自のディレクトリ構成を使いたい場合は、Nuxt KitのaddComponentsDirやaddComponentといったAPIを活用して、柔軟にコンポーネント登録をカスタマイズする必要があります。
この機能を正しく理解し使いこなすことで、以下のような課題を解決できます。
- コンポーネントの自動インポート範囲を拡張し、コードの重複を減らす
- グローバル登録やプレフィックス付与で命名衝突を防止
- 非同期ロードやアイランドアーキテクチャ対応でパフォーマンス最適化
まず結論:Nuxtのコンポーネント登録で押さえるべきポイント
- 自動インポートは便利だが、必要に応じて
addComponentsDirでカスタマイズ可能 prefixやpathPrefixでコンポーネント名の衝突を防げるglobalオプションでグローバル登録もできるが、乱用はパフォーマンス低下の原因に- 非同期ロード(
isAsync)やwebpackのマジックコメント(prefetch/preload)で読み込み制御が可能 - 開発中は
watchオプションで変更検知を有効にできる - アイランドアーキテクチャ対応の
islandオプションも利用可能
いつ使うべきか?使わない方がよいケースは?
使うべきケース
- プロジェクトのコンポーネントが
components以外のディレクトリにある場合 - 外部パッケージやモジュールのコンポーネントを自動登録したい場合
- コンポーネント名の衝突を避けるためにプレフィックスを付けたい場合
- パフォーマンス向上のためにコンポーネントを非同期ロードしたい場合
- アイランドアーキテクチャを採用している場合
使わない方がよいケース
- 小規模プロジェクトで
componentsディレクトリのみを使っている場合(過剰な設定は不要) - グローバル登録を乱用して、不要なコンポーネントまで常に読み込んでしまう場合
- コンポーネントの動的な切り替えや条件付きロードが不要な場合
実務でよくあるユースケースとサンプルコード
1. 独自ディレクトリのコンポーネントを自動登録
export default defineNuxtModule({
setup() {
addComponentsDir({
path: resolve('./src/ui-components'),
prefix: 'Ui',
global: true
})
}
})
src/ui-components内のコンポーネントをUiプレフィックス付きでグローバル登録- 例:
UiButton,UiModalとして利用可能
2. 非同期ロードで初期バンドルを軽量化
addComponentsDir({
path: resolve('./components/async'),
isAsync: true,
prefetch: true
})
isAsync: trueでコンポーネントを別チャンクに分割prefetch: trueでユーザーのブラウザがアイドル時に先読みを行う- ページの初期表示速度向上に寄与
3. アイランドアーキテクチャ対応コンポーネントの登録
addComponentsDir({
path: resolve('./components/islands'),
island: true
})
- アイランドとして登録し、部分的にクライアントサイドで動的にHydration可能
- SSRとCSRのバランスを取りやすくなる
よくある落とし穴・注意点
1. グローバル登録の乱用によるパフォーマンス低下
グローバル登録は便利ですが、すべてのコンポーネントが常にバンドルに含まれ、初期ロードが重くなる可能性があります。
必要なコンポーネントだけをローカル登録や非同期ロードで管理することを推奨します。
2. Hydrationエラーの原因になる非同期コンポーネントの扱い
非同期ロードしたコンポーネントは、SSRとCSRでレンダリング結果が異なる場合にHydrationエラーを引き起こすことがあります。
特に状態依存のUIや動的に変わるコンポーネントは注意が必要です。
3. ファイル監視(watch)を有効にするとビルド負荷が増加
開発中にwatch: trueを設定すると、ファイルの追加・削除をリアルタイムで検知できますが、監視対象が多いとビルド速度が低下することがあります。
必要な場合のみ有効にしましょう。
4. プレフィックスやパスプレフィックスの設定ミスによる名前衝突
複数のディレクトリから同名コンポーネントを登録する場合、プレフィックスやpathPrefixを適切に設定しないと名前衝突が発生し、意図しないコンポーネントが使われることがあります。
まとめ
Nuxtのコンポーネント登録機能は、開発効率とパフォーマンスの両面で強力なツールです。
自動インポートの恩恵を受けつつ、addComponentsDirなどのAPIで柔軟にカスタマイズすることで、プロジェクトの規模や要件に応じた最適なコンポーネント管理が可能になります。
ただし、グローバル登録の乱用や非同期ロードの扱いには注意が必要です。
本記事のポイントを押さえて、Nuxtのコンポーネント機能を効果的に活用してください。
title: 'NuxtのaddComponentでコンポーネント自動登録を活用する方法と実務的ポイント' description: 'NuxtのaddComponent関数を使ったコンポーネントの自動インポート登録について、基本から実務での活用例、注意点まで詳しく解説します。初〜中級者向けにわかりやすく丁寧に説明。'
NuxtのaddComponentでコンポーネント自動登録を活用する方法と実務的ポイント
Nuxtの開発において、コンポーネントの自動インポートはコードの保守性や開発効率を大きく向上させます。addComponentはモジュールやプラグインの中でコンポーネントを自動的に登録するためのAPIで、手動でimportや登録を繰り返す手間を省けます。
本記事では、addComponentの基本的な使い方から、実務での具体的なユースケース、そしてSSRやHydrationに関する注意点まで幅広く解説します。Nuxtのモジュール開発やカスタムコンポーネントの管理に役立つ内容です。
まず結論:addComponentのポイント
- コンポーネントを自動的に登録できるため、importや登録コードを省略可能
- 名前やパス、エクスポート形式など細かく指定でき、柔軟な管理が可能
globalオプションでグローバル登録、modeでクライアント/サーバー限定レンダリングも設定可能- Lazyロード時のプリフェッチやプリロードもwebpackのマジックコメントで制御可能
- アイランドアーキテクチャ対応の
islandオプションも利用できる
いつ使うべきか?使わない方がよいケースは?
使うべきケース
- モジュールやプラグイン開発時に、複数のコンポーネントをまとめて自動登録したい場合
- npmパッケージとして配布するコンポーネント群をNuxtプロジェクトに簡単に組み込みたいとき
- グローバル登録が望ましい共通UIコンポーネントを一括管理したい場合
- クライアント専用やサーバー専用のコンポーネントを明示的に分けて登録したいとき
使わない方がよいケース
- 単一のコンポーネントを一度だけ使うだけなら、通常のimportで十分な場合
- 動的にコンポーネント名やパスが変わるような特殊なケース(addComponentは静的登録向き)
- コンポーネントの読み込みタイミングやチャンク分割を細かく制御したい場合は、手動importや動的importの方が柔軟
実務でよくあるユースケースとサンプルコード
1. モジュール内で複数コンポーネントを自動登録
モジュール開発時に複数のVueコンポーネントをまとめて登録し、利用者がimport不要で使えるようにする例です。
import { defineNuxtModule, createResolver, addComponent } from '@nuxt/kit'
export default defineNuxtModule({
meta: { name: 'my-ui-module' },
async setup() {
const resolver = createResolver(import.meta.url)
addComponent({
name: 'MyButton',
filePath: resolver.resolve('./components/MyButton.vue'),
global: true,
})
addComponent({
name: 'MyModal',
filePath: resolver.resolve('./components/MyModal.vue'),
global: true,
})
},
})
2. 名前付きエクスポートのコンポーネントを登録
npmパッケージから名前付きエクスポートされているコンポーネントを自動登録する例です。
import { addComponent, defineNuxtModule } from '@nuxt/kit'
export default defineNuxtModule({
setup() {
addComponent({
name: 'ExternalWidget',
export: 'Widget',
filePath: 'external-widget-package',
})
},
})
3. クライアント専用コンポーネントの登録
サーバー側では不要なコンポーネントをクライアント限定で登録し、SSR負荷を軽減する例です。
addComponent({
name: 'ClientOnlyMap',
filePath: './components/ClientOnlyMap.vue',
mode: 'client',
})
よくある落とし穴・注意点
SSRとHydrationの問題
modeオプションでclientやserverを指定しないと、サーバーとクライアントでレンダリング結果が異なりHydrationエラーが発生することがあります。- クライアント専用のUIライブラリやブラウザAPIを使うコンポーネントは
mode: 'client'を必ず指定しましょう。
パフォーマンスへの影響
prefetchやpreloadオプションはwebpackのマジックコメントに影響し、チャンクの読み込みタイミングを制御します。- 不要にプリフェッチを多用すると初期ロードが重くなるため、重要なコンポーネントに絞って設定するのが望ましいです。
グローバル登録の乱用に注意
global: trueで登録するとどこでも使える反面、名前衝突やバンドルサイズ増加のリスクがあります。- 必要なコンポーネントだけグローバルにし、他はローカル登録や動的importを検討しましょう。
まとめ
addComponentはNuxtのモジュールやプラグイン開発で非常に便利なAPIで、コンポーネントの自動登録を簡単に実現します。
適切に使うことで開発効率が上がり、コードの見通しも良くなりますが、SSRやHydrationの問題、パフォーマンス面の注意も必要です。
実務では用途に応じてmodeやglobal、prefetchなどのオプションを使い分け、最適なコンポーネント管理を目指しましょう。
Nuxtの公式ドキュメントだけでなく、実際のモジュールのソースコードやwebpackのマジックコメントの挙動も確認すると理解が深まります。
※このページは Nuxt.js 公式ドキュメントの翻訳ページです。
公式ドキュメントの該当ページはこちら:
https://nuxt.com/docs/3.x/api/kit/components