---
title: "模板"
description: "Nuxt Kit 提供了一组工具，帮助你处理模板。这些函数允许你在开发和构建时生成额外的文件。"
canonical_url: "https://nuxt.zhcndoc.com/docs/3.x/api/kit/templates"
---
# 模板

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

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

## `addTemplate`

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

### 用法

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

### 类型

```ts twoslash
// @errors: 2391
import type { NuxtTemplate, ResolvedNuxtTemplate } from '@nuxt/schema'
// ---cut---
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>`{lang="ts"} | 否   | 一个函数，接收 `options` 对象，返回字符串或解析为字符串的 Promise。如果提供了 `src`，此函数会被忽略。 |
| `write`       | `boolean`                                                 | 否   | 如果设置为 `true`，模板将写入目标文件；否则只存在于虚拟文件系统中。                           |

### 示例

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

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

```ts twoslash [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` 别名导入它：

```ts [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` 中，并将其注册为类型声明。

### 用法

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

### 类型

```ts
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>`{lang="ts"} | 否   | 一个函数，接收 `options` 对象，返回字符串或解析为字符串的 Promise。如果提供了 `src`，此函数会被忽略。 |

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

| 属性      | 类型        | 必需  | 说明                             |
| ------- | --------- | --- | ------------------------------ |
| `nuxt`  | `boolean` | 否   | 如果设置为 `true`，类型将添加到 Nuxt 上下文。  |
| `nitro` | `boolean` | 否   | 如果设置为 `true`，类型将添加到 Nitro 上下文。 |

### 示例

#### 向 Nitro 上下文添加类型模板

默认情况下，只会将类型声明添加到 Nuxt 上下文。要同时添加到 Nitro 上下文，请设置 `nitro` 为 `true`。

```ts twoslash
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` 模块。

```ts [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 服务器构建中。

### 用法

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

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

### 类型

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

### 参数

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

| 属性            | 类型                                           | 必需  | 说明                          |
| ------------- | -------------------------------------------- | --- | --------------------------- |
| `filename`    | `string`                                     | 是   | 模板文件名。                      |
| `getContents` | `() => string \| Promise<string>`{lang="ts"} | 是   | 一个函数，返回字符串或解析为字符串的 Promise。 |

### 示例

#### 为 Nitro 创建虚拟文件

下面的示例演示如何创建一个可用于 Nuxt Nitro 服务器构建的虚拟文件。

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

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

然后在运行时文件中使用：

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

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

## `updateTemplates`

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

### 用法

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

### 类型

```ts
async function updateTemplates (options: UpdateTemplatesOptions): void
```

### 参数

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

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

---

- [源码](https://github.com/nuxt/nuxt/blob/main/packages/kit/src/template.ts)


## Sitemap

See the full [sitemap](https://nuxt.zhcndoc.com/sitemap.md) for all pages.
