Nuxt レイヤーの作成

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

Nuxtレイヤーは、モノレポ内、またはGitリポジトリやnpmパッケージから部分的なNuxtアプリケーションを共有および再利用できる強力な機能です。レイヤーの構造は標準のNuxtアプリケーションとほぼ同じなので、オーサリングと保守が簡単です。

Docs > 4 X > Getting Started > Layers で詳細をご覧ください。

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

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

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

基本的な例

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

レイヤーの優先順位

複数のレイヤーから拡張する場合、優先順位を理解することが重要です

  1. extends内のレイヤー - 早いエントリほど優先度が高い(最初のものが2番目のものを上書きします)
  2. アルファベット順(ZがAを上書き)で~~/layersディレクトリから自動スキャンされたローカルレイヤー
  3. あなたのプロジェクトはスタック内で最も優先度が高く、常に他のレイヤーを上書きします

例:

nuxt.config.ts
export default defineNuxtConfig({
  extends: [
    // Highest priority (among extends)
    './layers/base',
    // Medium priority
    './layers/theme',
    // Lower priority
    './layers/custom',
  ],
  // Your project has the highest priority
})

~~/layers/a~~/layers/zのような自動スキャンされたレイヤーも持っている場合、完全な上書き順序は次のようになります。base > theme > custom > z > a > あなたのプロジェクト。

スターターテンプレート

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

ターミナル
npm create nuxt -- --template layer nuxt-layer

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

レイヤーの公開

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

Gitリポジトリ

Nuxtレイヤーを共有するためにgitリポジトリを使用できます。いくつかの例

nuxt.config.ts
export default defineNuxtConfig({
  extends: [
    // GitHub Remote Source
    'github:username/repoName',
    // GitHub Remote Source within /base directory
    'github:username/repoName/base',
    // GitHub Remote Source from dev branch
    'github:username/repoName#dev',
    // GitHub Remote Source from v1.0.0 tag
    'github:username/repoName#v1.0.0',
    // GitLab Remote Source example
    'gitlab:username/repoName',
    // Bitbucket Remote Source example
    'bitbucket:username/repoName',
  ],
})
プライベートなリモートソースを拡張したい場合は、トークンを提供するために環境変数GIGET_AUTH=<token>を追加する必要があります。
自己ホスト型GitHubまたはGitLabインスタンスからリモートソースを拡張したい場合は、環境変数GIGET_GITHUB_URL=<url>またはGIGET_GITLAB_URL=<url>でURLを指定するか、直接設定してください。authオプションnuxt.config内。
リモートソースをレイヤーとして拡張する場合、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 Module with scope
    '@scope/moduleName',
    // or just the module name
    '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パッケージとして公開する場合は、nodeモジュールをダウンロードするために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 'node:url'
import { dirname, join } from 'node:path'

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

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

Nuxtモジュールの多層サポート

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

modules/my-module.ts
export default defineNuxtModule({
  setup (_options, nuxt) {
    for (const layer of nuxt.options._layers) {
      // You can check for a custom directory existence to extend for each layer
      console.log('Custom extension for', layer.cwd, layer.config)
    }
  },
})

注記

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

さらに深く

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

GitHubでのレイヤーサポートの改善に向けた継続的な開発をご覧ください。