模板
模板允许你在开发和构建时生成额外的文件。这些文件将在虚拟文件系统中可用,并可在插件、布局、组件等中使用。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' }),
})
},
})
类型
// @errors: 2391
import type { NuxtTemplate, ResolvedNuxtTemplate } from '@nuxt/schema'
// ---cut---
function addTemplate (template: NuxtTemplate | string): ResolvedNuxtTemplate
参数
template: 一个模板对象或指向模板的字符串路径。如果提供字符串,它将被转换为一个模板对象并将 src 设置为该字符串值。如果提供的是模板对象,则必须包含以下属性:
| Property | Type | Required | Description |
|---|---|---|---|
src | string | false | 模板路径。如果未提供 src,则必须改为提供 getContents。 |
filename | string | false | 模板的文件名。如果未提供 filename,则会根据 src 路径生成。在这种情况下,src 选项是必需的。 |
dst | string | false | 目标文件路径。如果未提供 dst,则会根据 filename 路径和 nuxt 的 buildDir 选项生成。 |
options | Options | false | 传递给模板的选项。 |
getContents | (data: Options) => string | Promise<string> | false | 一个会使用 options 对象调用的函数。它应返回一个字符串,或返回一个解析为字符串的 promise。如果提供了 src,则会忽略此函数。 |
write | boolean | false | 如果设置为 true,模板将被写入目标文件。否则,模板仅在虚拟文件系统中使用。 |
dependsOn | Array<'pages' | 'plugins'> | ((change: { event, path }, ctx: { nuxt, app, options }) => boolean) | false | 模板输出所依赖的被监听输入,除了 nuxt.options 和应用的解析结构之外。若模板从不读取任何被监听文件的内容,请将其设为 [],这样当文件发生变化但没有文件被添加或移除时,Nuxt 就可以在开发模式下跳过重新编译。若模板读取了已知来源,请列出这些键;或者传入一个函数来按每次变更决定。未声明任何依赖的模板会在每次变更时重新生成。 |
示例
为运行时插件创建虚拟文件
在此示例中,我们在模块中合并一个对象,并在运行时插件中使用该结果。
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' }),
})
},
})
跳过开发环境中的重新生成
默认情况下,Nuxt 会在每次监听到文件事件时重新编译模板,因为它无法知道模板读取了什么。如果你的模板只由配置以及文件是否存在决定,请将这一点声明出来,这样 Nuxt 在文件被编辑时就可以保持模板不变:
import { addTemplate, defineNuxtModule } from '@nuxt/kit'
export default defineNuxtModule({
setup (options, nuxt) {
addTemplate({
filename: 'my-module/config.mjs',
dependsOn: [],
getContents: () => 'export default ' + JSON.stringify(options),
})
},
})
如果模板读取的是已知来源,请按键名声明:
addTemplate({
filename: 'my-module/routes.mjs',
dependsOn: ['pages'],
getContents: ({ app }) => generateRoutes(app.pages),
})
而如果它读取的是 Nuxt 不知道的文件,比如你自己扫描的一组 YAML 文件,请改为传入一个函数:
addTemplate({
filename: 'my-module/content.mjs',
dependsOn: ({ path }) => path.endsWith('.yaml'),
getContents: () => generateContents(),
})
在上面的模块中,我们生成了一个名为 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-expect-error - 虚拟文件
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 设置为该字符串值。如果提供的是模板对象,则必须包含以下属性:
| Property | Type | Required | Description |
|---|---|---|---|
src | string | false | 模板的路径。如果未提供 src,则必须提供 getContents。 |
filename | string | false | 模板的文件名。如果未提供 filename,将根据 src 路径生成。在这种情况下,src 选项是必需的。 |
dst | string | false | 目标文件的路径。如果未提供 dst,将根据 filename 路径和 nuxt 的 buildDir 选项生成。 |
options | Options | false | 传递给模板的选项。 |
getContents | (data: Options) => string | Promise<string> | false | 一个将使用 options 对象调用的函数。它应返回一个字符串或一个解析为字符串的 Promise。如果提供了 src,此函数将被忽略。 |
context: 可以传入一个可选的上下文对象来控制类型被添加的位置。如果省略,类型将仅添加到 Nuxt 上下文。该对象支持以下属性:
| Property | Type | Required | Description |
|---|---|---|---|
nuxt | boolean | false | 如果设置为 true,类型将被添加到 Nuxt 上下文。 |
nitro | boolean | false | 如果设置为 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',
}
// 对用户执行某些操作
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: 一个模板对象。它必须具有以下属性:
| 属性 | 类型 | 必需 | 描述 |
|---|---|---|---|
filename | string | true | 模板的文件名。 |
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'
},
})
},
})
然后在运行时文件中
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 | false | 一个将使用 template 对象调用的函数。它应返回一个布尔值,指示是否应重新生成该模板。如果未提供 filter,则将重新生成所有模板。 |