模板

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

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

addTemplate

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

用法

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' })
    })
  }
})

类型

function addTemplate (template: NuxtTemplate | string): ResolvedNuxtTemplate

参数

template:模板对象或模板路径字符串。如果提供字符串,将被转换为 src 属性为该字符串的模板对象。如果提供模板对象,必须包含以下属性:

属性类型必需说明
srcstring模板路径。如果未提供 src,则必须提供 getContents 函数。
filenamestring模板文件名。如果未提供,文件名将由 src 生成。在这种情况下,src 为必需。
dststring目标文件路径。如果未提供,路径将根据 filename 和 Nuxt 的 buildDir 选项生成。
optionsOptions传递给模板的选项。
getContents(data: Options) => string | Promise<string>一个函数,接收 options 对象,返回字符串或解析为字符串的 Promise。如果提供了 src,此函数会被忽略。
writeboolean如果设置为 true,模板将写入目标文件;否则只存在于虚拟文件系统中。

示例

为运行时插件创建虚拟文件

下面的示例展示如何在模块中合并对象,并在运行时插件中使用结果。

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-ignore
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 中,并将其注册为类型声明。

用法

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
}`,
    })
  },
})

类型

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

参数

template:模板对象或模板路径字符串。如果提供字符串,将被转换为 src 属性为该字符串的模板对象。如果提供模板对象,必须包含以下属性:

属性类型必需说明
srcstring模板路径。如果未提供 src,则必须提供 getContents 函数。
filenamestring模板文件名。如果未提供,文件名将由 src 生成。在这种情况下,src 为必需。
dststring目标文件路径。如果未提供,路径将根据 filename 和 Nuxt 的 buildDir 选项生成。
optionsOptions传递给模板的选项。
getContents(data: Options) => string | Promise<string>一个函数,接收 options 对象,返回字符串或解析为字符串的 Promise。如果提供了 src,此函数会被忽略。

context:可选的上下文对象,用于控制类型声明添加的位置。如果省略,则类型只会添加到 Nuxt 上下文。此对象支持以下属性:

属性类型必需说明
nuxtboolean如果设置为 true,类型将添加到 Nuxt 上下文。
nitroboolean如果设置为 true,类型将添加到 Nitro 上下文。

示例

向 Nitro 上下文添加类型模板

默认情况下,只会将类型声明添加到 Nuxt 上下文。要同时添加到 Nitro 上下文,请设置 nitrotrue

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',
  }

  // 这里可以用 user 做一些事情

  return user
})

addServerTemplate

添加一个虚拟文件,可用于 Nuxt Nitro 服务器构建中。

用法

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

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

类型

function addServerTemplate (template: NuxtServerTemplate): NuxtServerTemplate

参数

template:模板对象。必须包含以下属性:

属性类型必需说明
filenamestring模板文件名。
getContents() => string | Promise<string>一个函数,返回字符串或解析为字符串的 Promise。

示例

为 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

重新生成符合筛选条件的模板。如果未提供筛选条件,则重新生成所有模板。

用法

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

export default defineNuxtModule({
  setup (options, nuxt) {
    const updateTemplatePaths = [
      resolve(nuxt.options.srcDir, 'pages'),
    ]
    // 当 pages 中的文件变化时,监听并重建 routes 模板列表
    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',
        })
      }
    })
  },
})

类型

async function updateTemplates (options: UpdateTemplatesOptions): void

参数

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

属性类型必需说明
filter(template: ResolvedNuxtTemplate) => boolean一个函数,接收 template 对象并返回布尔值,指示该模板是否应重新生成。如果未提供,所有模板将被重新生成。