模板
模板允许在开发和构建时生成额外的文件。这些文件将存在于虚拟文件系统中,并可用于插件、布局、组件等。addTemplate 和 addTypeTemplate 允许你向 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 属性为该字符串的模板对象。如果提供模板对象,必须包含以下属性:
| 属性 | 类型 | 必需 | 说明 | 
|---|---|---|---|
src | string | 否 | 模板路径。如果未提供 src,则必须提供 getContents 函数。 | 
filename | string | 否 | 模板文件名。如果未提供,文件名将由 src 生成。在这种情况下,src 为必需。 | 
dst | string | 否 | 目标文件路径。如果未提供,路径将根据 filename 和 Nuxt 的 buildDir 选项生成。 | 
options | Options | 否 | 传递给模板的选项。 | 
getContents | (data: Options) => string | Promise<string> | 否 | 一个函数,接收 options 对象,返回字符串或解析为字符串的 Promise。如果提供了 src,此函数会被忽略。 | 
write | boolean | 否 | 如果设置为 true,模板将写入目标文件;否则只存在于虚拟文件系统中。 | 
示例
为运行时插件创建虚拟文件
下面的示例展示如何在模块中合并对象,并在运行时插件中使用结果。
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 别名导入它:
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 属性为该字符串的模板对象。如果提供模板对象,必须包含以下属性:
| 属性 | 类型 | 必需 | 说明 | 
|---|---|---|---|
src | string | 否 | 模板路径。如果未提供 src,则必须提供 getContents 函数。 | 
filename | string | 否 | 模板文件名。如果未提供,文件名将由 src 生成。在这种情况下,src 为必需。 | 
dst | string | 否 | 目标文件路径。如果未提供,路径将根据 filename 和 Nuxt 的 buildDir 选项生成。 | 
options | Options | 否 | 传递给模板的选项。 | 
getContents | (data: Options) => string | Promise<string> | 否 | 一个函数,接收 options 对象,返回字符串或解析为字符串的 Promise。如果提供了 src,此函数会被忽略。 | 
context:可选的上下文对象,用于控制类型声明添加的位置。如果省略,则类型只会添加到 Nuxt 上下文。此对象支持以下属性:
| 属性 | 类型 | 必需 | 说明 | 
|---|---|---|---|
nuxt | boolean | 否 | 如果设置为 true,类型将添加到 Nuxt 上下文。 | 
nitro | boolean | 否 | 如果设置为 true,类型将添加到 Nitro 上下文。 | 
示例
向 Nitro 上下文添加类型模板
默认情况下,只会将类型声明添加到 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 模块。
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:模板对象。必须包含以下属性:
| 属性 | 类型 | 必需 | 说明 | 
|---|---|---|---|
filename | string | 是 | 模板文件名。 | 
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'
      },
    })
  },
})
然后在运行时文件中使用:
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 对象并返回布尔值,指示该模板是否应重新生成。如果未提供,所有模板将被重新生成。 |