nuxt logo

文档翻译(非官方)

模板

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

类型

// @errors: 2391
import type { NuxtTemplate, ResolvedNuxtTemplate } from '@nuxt/schema'
// ---cut---
function addTemplate (template: NuxtTemplate | string): ResolvedNuxtTemplate

参数

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

属性类型必需描述
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,模板将被写入目标文件。否则,模板将仅在虚拟文件系统中使用。

示例

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

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

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 设置为字符串值。如果提供的是模板对象,它必须具有以下属性:

属性类型必需描述
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 上下文中。此对象支持以下属性:

属性类型必需描述
nuxtbooleanfalse如果设置为 true,类型将添加到 Nuxt 上下文中。
nitrobooleanfalse如果设置为 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 模块。

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

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

  // 对用户进行一些操作

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

类型

// @errors: 2391
import type { NuxtServerTemplate } from '@nuxt/schema'
// ---cut---
function addServerTemplate (template: NuxtServerTemplate): NuxtServerTemplate

参数

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

属性类型必需描述
filenamestringtrue模板的文件名。
getContents() => string | Promise<string>true一个将与 options 对象一起调用的函数。它应返回一个字符串或一个解析为字符串的 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'),
    ]
    // 当其中一个页面更改时,监视并重建路由模板列表
    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) => booleanfalse一个将与 template 对象一起调用的函数。它应返回一个布尔值,指示是否应重新生成模板。如果未提供 filter,将重新生成所有模板。