模板

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

属性类型是否必需描述
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'
      },
    })
  },
})

类型

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,则将重新生成所有模板。