brand logo

ドキュメント

Nuxt レイヤーの作成

Nuxt はデフォルトのファイルや設定を拡張するための強力なシステムを提供します。

Nuxt レイヤーは、モノレポ内や git リポジトリ、npm パッケージから部分的な Nuxt アプリケーションを共有および再利用するための強力な機能です。レイヤーの構造は標準的な Nuxt アプリケーションとほぼ同じであるため、作成や管理が容易です。

こちらも参照 getting-started > layers

最小限の Nuxt レイヤーディレクトリには、レイヤーであることを示すために nuxt.config.ts ファイルを含める必要があります。

base/nuxt.config.ts
export default defineNuxtConfig({})

さらに、レイヤーディレクトリ内の特定の他のファイルは自動的にスキャンされ、このレイヤーを拡張するプロジェクトで Nuxt によって使用されます。

  • components/* - デフォルトのコンポーネントを拡張
  • composables/* - デフォルトのコンポーザブルを拡張
  • layouts/* - デフォルトのレイアウトを拡張
  • pages/* - デフォルトのページを拡張
  • plugins/* - デフォルトのプラグインを拡張
  • server/* - デフォルトのサーバーエンドポイントとミドルウェアを拡張
  • utils/* - デフォルトのユーティリティを拡張
  • nuxt.config.ts- デフォルトの nuxt 設定を拡張
  • app.config.ts - デフォルトのアプリ設定を拡張

基本的な例

export default defineNuxtConfig({
  extends: [
    './base'
  ]
})

スターターテンプレート

始めるには、nuxt/starter/layer テンプレートを使用してレイヤーを初期化できます。これにより、構築可能な基本構造が作成されます。始めるには、ターミナルで次のコマンドを実行します:

Terminal
npm create nuxt -- --template layer nuxt-layer

次のステップについては README の指示に従ってください。

レイヤーの公開

レイヤーはリモートソースまたは npm パッケージを使用して公開および共有できます。

Git リポジトリ

Git リポジトリを使用して Nuxt レイヤーを共有できます。いくつかの例を示します:

nuxt.config.ts
export default defineNuxtConfig({
  extends: [
    'github:username/repoName',        // GitHub リモートソース
    'github:username/repoName/base',   // /base ディレクトリ内の GitHub リモートソース
    'github:username/repoName#dev',    // dev ブランチからの GitHub リモートソース
    'github:username/repoName#v1.0.0', // v1.0.0 タグからの GitHub リモートソース
    'gitlab:username/repoName',        // GitLab リモートソースの例
    'bitbucket:username/repoName',     // Bitbucket リモートソースの例
  ]
})

プライベートなリモートソースを拡張したい場合は、トークンを提供するために環境変数 GIGET_AUTH=<token> を追加する必要があります。

セルフホストの GitHub または GitLab インスタンスからリモートソースを拡張したい場合は、その URL を GIGET_GITHUB_URL=<url> または GIGET_GITLAB_URL=<url> 環境変数で提供する必要があります。または、nuxt.configauth オプションで直接設定します。

リモートソースをレイヤーとして拡張する場合、その依存関係を Nuxt の外部でアクセスすることはできません。例えば、リモートレイヤーが eslint プラグインに依存している場合、それはあなたの eslint 設定で使用できません。これは、これらの依存関係が特別な場所 (node_modules/.c12/layer_name/node_modules/) に配置され、パッケージマネージャーからアクセスできないためです。

git リモートソースを使用する場合、レイヤーに npm 依存関係があり、それをインストールしたい場合は、レイヤーオプションで install: true を指定することで可能です。

nuxt.config.ts
export default defineNuxtConfig({
  extends: [
    ['github:username/repoName', { install: true }]
  ]
})

npm パッケージ

Nuxt レイヤーを拡張したいファイルや依存関係を含む npm パッケージとして公開できます。これにより、設定を他の人と共有したり、複数のプロジェクトで使用したり、プライベートに使用したりできます。

npm パッケージから拡張するには、モジュールが npm に公開され、ユーザーのプロジェクトに devDependency としてインストールされていることを確認する必要があります。その後、現在の nuxt 設定を拡張するためにモジュール名を使用できます:

nuxt.config.ts
export default defineNuxtConfig({
  extends: [
    // スコープ付きの Node モジュール
    '@scope/moduleName',
    // または単にモジュール名
    'moduleName'
  ]
})

レイヤーディレクトリを npm パッケージとして公開するには、package.json に正しいプロパティが記入されていることを確認する必要があります。これにより、パッケージが公開されるときにファイルが含まれることが保証されます。

package.json
{
  "name": "my-theme",
  "version": "1.0.0",
  "type": "module",
  "main": "./nuxt.config.ts",
  "dependencies": {},
  "devDependencies": {
    "nuxt": "^3.0.0"
  }
}

レイヤーでインポートされた依存関係は 明示的に dependencies に追加されていることを確認してください。nuxt 依存関係や、公開前にレイヤーをテストするためだけに使用されるものは、devDependencies フィールドに残しておくべきです。

これで、モジュールを npm に公開する準備が整いました。公開は公開またはプライベートのいずれかで行えます。

レイヤーをプライベートな npm パッケージとして公開する場合、npm にログインしてノードモジュールをダウンロードするために認証する必要があります。

ヒント

名前付きレイヤーエイリアス

自動スキャンされたレイヤー(~~/layers ディレクトリから)は自動的にエイリアスを作成します。例えば、~~/layers/test レイヤーに #layers/test でアクセスできます。

他のレイヤーに名前付きレイヤーエイリアスを作成したい場合は、レイヤーの設定で名前を指定できます。

nuxt.config.ts
export default defineNuxtConfig({
  $meta: {
    name: 'example',
  },
})

これにより、レイヤーを指す #layers/example のエイリアスが生成されます。

相対パスとエイリアス

レイヤーのコンポーネントやコンポーザブルでグローバルエイリアス(~/@/ など)を使用してインポートする場合、これらのエイリアスはユーザーのプロジェクトパスに対して解決されることに注意してください。回避策として、相対パスを使用してインポートするか、名前付きレイヤーエイリアスを使用できます。

また、レイヤーの nuxt.config ファイルで相対パスを使用する場合(ネストされた extends を除く)、それらはレイヤーではなくユーザーのプロジェクトに対して解決されます。回避策として、nuxt.config で完全に解決されたパスを使用します:

nuxt.config.ts
import { fileURLToPath } from 'url'
import { dirname, join } from 'path'

const currentDir = dirname(fileURLToPath(import.meta.url))

export default defineNuxtConfig({
  css: [
    join(currentDir, './assets/main.css')
  ]
})

Nuxt モジュールのためのマルチレイヤーサポート

内部配列 nuxt.options._layers を使用して、モジュールのカスタムマルチレイヤー処理をサポートできます。

modules/my-module.ts
export default defineNuxtModule({
  setup(_options, nuxt) {
    for (const layer of nuxt.options._layers) {
      // 各レイヤーのカスタムディレクトリの存在を確認して拡張できます
      console.log('カスタム拡張', layer.cwd, layer.config)
    }
  }
})

注意事項:

  • _layers 配列の先頭の項目は優先度が高く、後の項目を上書きします
  • ユーザーのプロジェクトは _layers 配列の最初の項目です

より深く理解する

設定の読み込みと拡張サポートは unjs/c12 によって処理され、unjs/defu を使用してマージされ、リモート git ソースは unjs/giget を使用してサポートされています。詳細を知るには、ドキュメントやソースコードを確認してください。

こちらも参照 github.com > nuxt > nuxt > issues > 13367

tips

このセクションは公式ドキュメントの翻訳ではなく、本サイト独自の補足記事です。

Nuxt レイヤー機能の実務的活用ガイド

Nuxt のレイヤー機能は、複数の Nuxt アプリケーション間でコードや設定を効率的に共有・再利用できる強力な仕組みです。特にモノレポ構成や複数プロジェクトで共通の UI コンポーネントや設定を管理したい場合に役立ちます。これにより、重複作業を減らし、保守性を高めることが可能です。

本記事では、Nuxt レイヤーの概要だけでなく、実務での活用シーンや注意点を踏まえた解説を行います。初〜中級の Nuxt ユーザーが理解しやすいように、具体例やポイントを交えて丁寧に説明します。


まず結論:Nuxt レイヤーのポイント

  • レイヤーは部分的な Nuxt アプリケーションとして機能し、設定やファイルを拡張できる
  • Git リポジトリや npm パッケージとして公開・共有が可能で、複数プロジェクトでの再利用に最適
  • レイヤー内の nuxt.config.ts が必須で、components/pages/ など標準的なディレクトリ構造を持つ
  • ユーザープロジェクトの extends 配列にレイヤーを指定して簡単に取り込める
  • 相対パスや名前付きエイリアスを活用し、依存関係の解決に注意が必要
  • 依存パッケージは明示的に dependencies に記載し、プライベートレイヤーは認証設定が必要

いつ使うべきか?使わない方がよいケースは?

使うべきケース

  • 複数プロジェクトで共通の UI コンポーネントやレイアウト、プラグインを共有したいとき
  • モノレポ構成で Nuxt アプリを分割しつつ、共通部分を一元管理したいとき
  • 社内やチームで標準設定やテーマを npm パッケージとして配布したいとき
  • Git リポジトリの特定ブランチやタグから設定を取り込み、バージョン管理したいとき

避けたほうがよいケース

  • 単一プロジェクト内での単純な設定拡張やカスタマイズのみの場合(過剰設計になる)
  • 依存関係が複雑で、レイヤー外からアクセスする必要がある場合(依存解決が難しい)
  • 頻繁に変更があり、レイヤーのバージョン管理や公開が煩雑になる場合

実務でよくあるユースケースとサンプルコード

1. 共通コンポーネントのレイヤー化

複数プロジェクトで使うボタンやカードなどの UI コンポーネントをレイヤーにまとめる例です。

// base/nuxt.config.ts
export default defineNuxtConfig({})
// base/components/BaseButton.vue
<template>
  <button class="base-button"><slot /></button>
</template>

<style>
.base-button {
  background-color: #007bff;
  color: white;
  padding: 0.5em 1em;
  border-radius: 4px;
}
</style>
// nuxt.config.ts(ユーザープロジェクト)
export default defineNuxtConfig({
  extends: ['./base']
})

このようにすることで、ユーザープロジェクトで <BaseButton /> をそのまま使えます。


2. Git リポジトリからのレイヤー拡張

GitHub の特定リポジトリやブランチからレイヤーを取り込む例です。

export default defineNuxtConfig({
  extends: [
    'github:username/shared-nuxt-layer#main'
  ]
})

これにより、リモートのレイヤーを簡単に取り込み、常に最新の共有設定を利用できます。


3. npm パッケージとしてのレイヤー公開

社内でテーマや設定を npm パッケージ化し、複数プロジェクトで利用する例。

export default defineNuxtConfig({
  extends: [
    '@my-org/nuxt-theme-layer'
  ]
})

package.json には依存関係を明示的に記載し、公開前に動作確認を行います。


よくある落とし穴・注意点

1. 依存関係の管理

レイヤー内で使用する npm パッケージは必ず dependencies に記載してください。devDependencies にのみあると、ユーザープロジェクトで依存が解決されずエラーになります。

2. 相対パスとエイリアスの解決

レイヤー内で ~/@/ のようなグローバルエイリアスを使うと、ユーザープロジェクトのルートに解決されてしまい、意図しない挙動になることがあります。回避策としては:

  • レイヤー内では相対パスを使う
  • 名前付きレイヤーエイリアス(例:#layers/example)を利用する

3. SSR と Hydration の影響

レイヤーで提供するコンポーネントやプラグインは SSR 対応を意識してください。特にクライアント専用のコードを含む場合は、Nuxt の標準的な SSR 対応方法を適用しないと、Hydration エラーやパフォーマンス低下の原因になります。

4. リモートレイヤーの依存パッケージの隔離

リモートレイヤーの依存は特殊な場所にインストールされるため、ユーザープロジェクトの ESLint やビルドツールからは直接アクセスできません。これにより、依存関係の重複や競合を防止しますが、設定が必要な場合は注意が必要です。


まとめ

Nuxt レイヤーは、複数プロジェクト間でのコード共有や設定管理を効率化する非常に便利な機能です。Git リポジトリや npm パッケージとして公開できるため、チーム開発やモノレポ構成に最適です。

ただし、依存関係の管理やパス解決、SSR 対応などの注意点もあります。これらを理解し、適切に運用することで、保守性の高い Nuxt アプリケーション群を構築できます。

ぜひ本記事のポイントを参考に、Nuxt レイヤーを活用して開発効率を向上させてください。


レイヤーの設定や公開に関しては、公式ドキュメントの他に GitHub の issue やコミュニティの情報も活用すると最新のベストプラクティスが得られます。