模板

源代码
Nuxt Kit 提供了一组实用工具来帮助你处理模板。这些函数允许你在开发和构建时生成额外的文件。

模板允许你在开发和构建时生成额外的文件。这些文件将在虚拟文件系统中可用,并可在插件、布局、组件等中使用。addTemplateaddTypeTemplate 允许你向 Nuxt 应用添加模板。updateTemplates 允许你重新生成与筛选器匹配的模板。

addTemplate

在构建期间将给定模板渲染到虚拟文件系统中,并可选地写入到项目的 buildDir

Usage

import { addTemplate, defineNuxtModule } from '@nuxt/kit'
import { defu } from 'defu'

export default defineNuxtModule({
  setup (options, nuxt) {
    const globalMeta = defu(nuxt.options.app.head, {
      charset: options.charset,
      viewport: options.viewport,
    })

    addTemplate({
      filename: 'meta.config.mjs',
      getContents: () => 'export default ' + JSON.stringify({ globalMeta, mixinKey: 'setup' }),
    })
  },
})

Type

function addTemplate (template: NuxtTemplate | string): ResolvedNuxtTemplate

Parameters

template: 一个模板对象或指向模板的字符串路径。如果提供字符串,它将被转换为一个模板对象并将 src 设置为该字符串值。如果提供的是模板对象,则必须包含以下属性:

PropertyTypeRequiredDescription
srcstringfalse模板的路径。如果未提供 src,则必须提供 getContents
filenamestringfalse模板的文件名。如果未提供 filename,将根据 src 路径生成。在这种情况下,src 选项是必需的。
dststringfalse目标文件的路径。如果未提供 dst,将根据 filename 路径和 nuxt 的 buildDir 选项生成。
optionsOptionsfalse传递给模板的选项。
getContents(data: Options) => string | Promise<string>false一个将使用 options 对象调用的函数。它应返回一个字符串或一个解析为字符串的 Promise。如果提供了 src,此函数将被忽略。
writebooleanfalse如果设置为 true,模板将被写入目标文件。否则,模板仅在虚拟文件系统中使用。

Examples

Creating a Virtual File for Runtime Plugin

在此示例中,我们在模块中合并一个对象,并在运行时插件中使用该结果。

module.ts
import { addTemplate, defineNuxtModule } from '@nuxt/kit'
import { defu } from 'defu'

export default defineNuxtModule({
  setup (options, nuxt) {
    const globalMeta = defu(nuxt.options.app.head, {
      charset: options.charset,
      viewport: options.viewport,
    })

    addTemplate({
      filename: 'meta.config.mjs',
      getContents: () => 'export default ' + JSON.stringify({ globalMeta, mixinKey: 'setup' }),
    })
  },
})

在上面的模块中,我们生成了一个名为 meta.config.mjs 的虚拟文件。在运行时插件中,我们可以使用 #build 别名导入它:

runtime/plugin.ts
import { createHead as createServerHead } from '@unhead/vue/server'
import { createHead as createClientHead } from '@unhead/vue/client'
import { defineNuxtPlugin } from '#imports'
// @ts-expect-error - virtual file
import metaConfig from '#build/meta.config.mjs'

export default defineNuxtPlugin((nuxtApp) => {
  const createHead = import.meta.server ? createServerHead : createClientHead
  const head = createHead()
  head.push(metaConfig.globalMeta)

  nuxtApp.vueApp.use(head)
})

addTypeTemplate

在构建期间将给定模板渲染到项目的 buildDir 中,然后将其注册为类型声明。

Usage

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

export default defineNuxtModule({
  setup () {
    addTypeTemplate({
      filename: 'types/markdown.d.ts',
      getContents: () => `declare module '*.md' {
  import type { ComponentOptions } from 'vue'
  const Component: ComponentOptions
  export default Component
}`,
    })
  },
})

Type

function addTypeTemplate (template: NuxtTypeTemplate | string, context?: { nitro?: boolean, nuxt?: boolean }): ResolvedNuxtTemplate

Parameters

template: 一个模板对象或指向模板的字符串路径。如果提供字符串,它将被转换为一个模板对象并将 src 设置为该字符串值。如果提供的是模板对象,则必须包含以下属性:

PropertyTypeRequiredDescription
srcstringfalse模板的路径。如果未提供 src,则必须提供 getContents
filenamestringfalse模板的文件名。如果未提供 filename,将根据 src 路径生成。在这种情况下,src 选项是必需的。
dststringfalse目标文件的路径。如果未提供 dst,将根据 filename 路径和 nuxt 的 buildDir 选项生成。
optionsOptionsfalse传递给模板的选项。
getContents(data: Options) => string | Promise<string>false一个将使用 options 对象调用的函数。它应返回一个字符串或一个解析为字符串的 Promise。如果提供了 src,此函数将被忽略。

context: 可以传入一个可选的上下文对象来控制类型被添加的位置。如果省略,类型将仅添加到 Nuxt 上下文。该对象支持以下属性:

PropertyTypeRequiredDescription
nuxtbooleanfalse如果设置为 true,类型将被添加到 Nuxt 上下文。
nitrobooleanfalse如果设置为 true,类型将被添加到 Nitro 上下文。

Examples

Adding Type Templates to the Nitro Context

默认情况下,-- 仅将类型声明添加到 Nuxt 上下文。要同时将它们添加到 Nitro 上下文,请将 nitro 设置为 true。

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

export default defineNuxtModule({
  setup () {
    addTypeTemplate({
      filename: 'types/auth.d.ts',
      getContents: () => `declare module '#auth-utils' {
  interface User {
    id: string;
    name: string;
  }

}`,
    }, {
      nitro: true,
    })
  },
})

这允许在 Nitro 上下文中使用 #auth-utils 模块。

server/api/auth.ts
import type { User } from '#auth-utils'

export default eventHandler(() => {
  const user: User = {
    id: '123',
    name: 'John Doe',
  }

  // do something with the user

  return user
})

addServerTemplate

添加一个虚拟文件,该文件可在 Nuxt Nitro 服务端构建中使用。

Usage

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

export default defineNuxtModule({
  setup () {
    addServerTemplate({
      filename: '#my-module/test.mjs',
      getContents () {
        return 'export const test = 123'
      },
    })
  },
})

Type

function addServerTemplate (template: NuxtServerTemplate): NuxtServerTemplate

Parameters

template: 一个模板对象。它必须具有以下属性:

PropertyTypeRequiredDescription
filenamestringtrue模板的文件名。
getContents() => string | Promise<string>true一个函数,将使用 options 对象调用。它应返回一个字符串或一个解析为字符串的 Promise。

Examples

Creating a Virtual File for Nitro

在此示例中,我们创建一个可在 Nuxt Nitro 服务端构建中使用的虚拟文件。

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

export default defineNuxtModule({
  setup () {
    addServerTemplate({
      filename: '#my-module/test.mjs',
      getContents () {
        return 'export const test = 123'
      },
    })
  },
})

然后在运行时文件中

server/api/test.ts
import { test } from '#my-module/test.js'

export default eventHandler(() => {
  return test
})

updateTemplates

重新生成与筛选器匹配的模板。如果未提供筛选器,则将重新生成所有模板。

Usage

import { defineNuxtModule, updateTemplates } from '@nuxt/kit'
import { resolve } from 'pathe'

export default defineNuxtModule({
  setup (options, nuxt) {
    const updateTemplatePaths = [
      resolve(nuxt.options.srcDir, 'pages'),
    ]
    // watch and rebuild routes template list when one of the pages changes
    nuxt.hook('builder:watch', async (event, relativePath) => {
      if (event === 'change') {
        return
      }

      const path = resolve(nuxt.options.srcDir, relativePath)
      if (updateTemplatePaths.some(dir => path.startsWith(dir))) {
        await updateTemplates({
          filter: template => template.filename === 'routes.mjs',
        })
      }
    })
  },
})

Type

async function updateTemplates (options: UpdateTemplatesOptions): void

Parameters

options: 传递给模板的选项。该对象可以具有以下属性:

PropertyTypeRequiredDescription
filter(template: ResolvedNuxtTemplate) => booleanfalse一个将使用 template 对象调用的函数。它应返回一个布尔值,指示是否应重新生成该模板。如果未提供 filter,则将重新生成所有模板。