Лейаут

Исходный код
Nuxt Kit предоставляет утилиты для регистрации лейаутов из модулей.

Лейаут — обёртка вокруг страниц: общий каркас из повторяющихся блоков (шапка, подвал и т.д.). Зарегистрировать лейаут из модуля можно через addLayout.

addLayout

Регистрирует шаблон как именованный лейаут приложения.

В Nuxt 2 лейаут error также может быть зарегистрирован с помощью этой утилиты. В Nuxt 3+ лейаут errorзаменён на страницу error.vue в корне проекта.

Использование

import { addLayout, createResolver, defineNuxtModule } from '@nuxt/kit'

export default defineNuxtModule({
  setup () {
    const { resolve } = createResolver(import.meta.url)

    addLayout({
      src: resolve('templates/custom-layout.ts'),
      filename: 'custom-layout.ts',
    }, 'custom')
  },
})

Тип

function addLayout (layout: NuxtTemplate | string, name: string): void

Параметры

layout: объект шаблона или строка с путём к шаблону. Строка превращается в объект с полем src. У объекта шаблона возможны поля:

СвойствоТипОбязательноОписание
srcstringfalseПуть к шаблону. Если нет src, нужен getContents.
filenamestringfalseИмя файла шаблона. Если не задано, выводится из src (тогда src обязателен).
dststringfalseПуть назначения. Если не задан, строится из filename и buildDir Nuxt.
optionsRecord<string, any>falseОпции, передаваемые в шаблон.
getContents(data) => string | Promise<string>falseФункция с объектом options, возвращающая строку или Promise со строкой. Если задан src, не используется.
writebooleanfalseПри true шаблон записывается на диск; иначе доступен только через виртуальную файловую систему.

name: имя лейаута для definePageMeta и т.п. (default, custom и др.).

Пример

Ниже регистрируется лейаут custom с шапкой и подвалом.

import { addLayout, defineNuxtModule } from '@nuxt/kit'

export default defineNuxtModule({
  setup () {
    addLayout({
      write: true,
      filename: 'my-layout.vue',
      getContents: () => `<template>
  <div>
    <header>Мой заголовок</header>
    <slot />
    <footer>Мой подвал</footer>
  </div>
</template>`,
    }, 'custom')
  },
})

Этот лейаут можно указать на страницах:

pages/about.vue
<script setup lang="ts">
definePageMeta({
  layout: 'custom',
})
</script>

<template>
  <div>Страница «О нас»</div>
</template>
Так как @vitejs/plugin-vue не подхватывает виртуальные .vue, для лейаутов на Vue задайте в первом аргументе addLayout опцию write: true.