Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Comprehensive Nuxt 3.x reference covering SSR, file-based routing, auto-imports, server routes, and Nitro deployment.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/advanced-layers.md
1---2name: nuxt-layers3description: Extending Nuxt applications with layers for code sharing and reusability4---56# Nuxt Layers78Layers allow sharing and reusing partial Nuxt applications across projects. They can include components, composables, pages, layouts, and configuration.910## Using Layers1112### From npm Package1314```ts15// nuxt.config.ts16export default defineNuxtConfig({17extends: [18'@my-org/base-layer',19'@nuxtjs/ui-layer',20],21})22```2324### From Git Repository2526```ts27// nuxt.config.ts28export default defineNuxtConfig({29extends: [30'github:username/repo',31'github:username/repo/base', // Subdirectory32'github:username/repo#v1.0', // Specific tag33'github:username/repo#dev', // Branch34'gitlab:username/repo',35'bitbucket:username/repo',36],37})38```3940### From Local Directory4142```ts43// nuxt.config.ts44export default defineNuxtConfig({45extends: [46'../base-layer',47'./layers/shared',48],49})50```5152### Auto-scanned Layers5354Place in `layers/` directory for automatic discovery:5556```57my-app/58├── layers/59│ ├── base/60│ │ └── nuxt.config.ts61│ └── ui/62│ └── nuxt.config.ts63└── nuxt.config.ts64```6566## Creating a Layer6768Minimal layer structure:6970```71my-layer/72├── nuxt.config.ts # Required73├── app/74│ ├── components/ # Auto-merged75│ ├── composables/ # Auto-merged76│ ├── layouts/ # Auto-merged77│ ├── middleware/ # Auto-merged78│ ├── pages/ # Auto-merged79│ ├── plugins/ # Auto-merged80│ └── app.config.ts # Merged81├── server/ # Auto-merged82└── package.json83```8485### Layer nuxt.config.ts8687```ts88// my-layer/nuxt.config.ts89export default defineNuxtConfig({90// Layer configuration91app: {92head: {93title: 'My Layer App',94},95},96// Shared modules97modules: ['@nuxt/ui'],98})99```100101### Layer Components102103```vue104<!-- my-layer/app/components/BaseButton.vue -->105<template>106<button class="base-btn">107<slot />108</button>109</template>110```111112Use in consuming project:113114```vue115<template>116<BaseButton>Click me</BaseButton>117</template>118```119120### Layer Composables121122```ts123// my-layer/app/composables/useTheme.ts124export function useTheme() {125const isDark = useState('theme-dark', () => false)126const toggle = () => isDark.value = !isDark.value127return { isDark, toggle }128}129```130131## Layer Priority132133Override order (highest to lowest):1341. Your project files1352. Auto-scanned layers (alphabetically, Z > A)1363. `extends` array (first > last)137138Control order with prefixes:139140```141layers/142├── 1.base/ # Lower priority143└── 2.theme/ # Higher priority144```145146## Layer Aliases147148Access layer files:149150```ts151// Auto-scanned layers get aliases152import Component from '#layers/base/components/Component.vue'153```154155Named aliases:156157```ts158// my-layer/nuxt.config.ts159export default defineNuxtConfig({160$meta: {161name: 'my-layer',162},163})164```165166```ts167// In consuming project168import { something } from '#layers/my-layer/utils'169```170171## Publishing Layers172173### As npm Package174175```json176{177"name": "my-nuxt-layer",178"version": "1.0.0",179"type": "module",180"main": "./nuxt.config.ts",181"dependencies": {182"@nuxt/ui": "^2.0.0"183},184"devDependencies": {185"nuxt": "^3.0.0"186}187}188```189190### Private Layers191192For private git repos:193194```bash195export GIGET_AUTH=<github-token>196```197198## Layer Best Practices199200### Use Resolved Paths201202```ts203// my-layer/nuxt.config.ts204import { fileURLToPath } from 'node:url'205import { dirname, join } from 'node:path'206207const currentDir = dirname(fileURLToPath(import.meta.url))208209export default defineNuxtConfig({210css: [211join(currentDir, './assets/main.css'),212],213})214```215216### Install Dependencies217218```ts219// nuxt.config.ts220export default defineNuxtConfig({221extends: [222['github:user/layer', { install: true }],223],224})225```226227### Disable Layer Modules228229```ts230// nuxt.config.ts231export default defineNuxtConfig({232extends: ['./base-layer'],233// Disable modules from layer234image: false, // Disables @nuxt/image235pinia: false, // Disables @pinia/nuxt236})237```238239## Starter Template240241Create a new layer:242243```bash244npx nuxi init --template layer my-layer245```246247## Example: Theme Layer248249```250theme-layer/251├── nuxt.config.ts252├── app/253│ ├── app.config.ts254│ ├── components/255│ │ ├── ThemeButton.vue256│ │ └── ThemeCard.vue257│ ├── composables/258│ │ └── useTheme.ts259│ └── assets/260│ └── theme.css261└── package.json262```263264```ts265// theme-layer/nuxt.config.ts266export default defineNuxtConfig({267css: ['~/assets/theme.css'],268})269```270271```ts272// theme-layer/app/app.config.ts273export default defineAppConfig({274theme: {275primaryColor: '#00dc82',276darkMode: false,277},278})279```280281```ts282// consuming-app/nuxt.config.ts283export default defineNuxtConfig({284extends: ['theme-layer'],285})286287// consuming-app/app/app.config.ts288export default defineAppConfig({289theme: {290primaryColor: '#ff0000', // Override291},292})293```294295<!--296Source references:297- https://nuxt.com/docs/getting-started/layers298- https://nuxt.com/docs/guide/going-further/layers299-->300