模板
模板允許你在開發和構建時生成額外檔案。這些檔案將在虛擬檔案系統中可用,並可用於外掛、佈局、元件等。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 | false | 模板路徑。如果未提供 src ,則必須提供 getContents 。 |
filename | string | false | 模板檔名。如果未提供 filename ,它將從 src 路徑生成。在這種情況下,src 選項是必需的。 |
dst | string | false | 目標檔案路徑。如果未提供 dst ,它將從 filename 路徑和 nuxt buildDir 選項生成。 |
options | 選項 | false | 要傳遞給模板的選項。 |
getContents | (data: Options) => string | Promise<string> | false | 一個將使用 options 物件呼叫的函式。它應該返回一個字串或解析為字串的 Promise。如果提供了 src ,此函式將被忽略。 |
write | boolean | false | 如果設定為 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-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,然後將其註冊為型別。
使用
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 | false | 模板路徑。如果未提供 src ,則必須提供 getContents 。 |
filename | string | false | 模板檔名。如果未提供 filename ,它將從 src 路徑生成。在這種情況下,src 選項是必需的。 |
dst | string | false | 目標檔案路徑。如果未提供 dst ,它將從 filename 路徑和 nuxt buildDir 選項生成。 |
options | 選項 | false | 要傳遞給模板的選項。 |
getContents | (data: Options) => string | Promise<string> | false | 一個將使用 options 物件呼叫的函式。它應該返回一個字串或解析為字串的 Promise。如果提供了 src ,此函式將被忽略。 |
context:可以傳遞可選的上下文物件以控制新增型別的位置。如果省略,型別將僅新增到 Nuxt 上下文。此物件支援以下屬性:
屬性 | 型別 | 必需 | 描述 |
---|---|---|---|
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',
}
// do something with the 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 | 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'),
]
// watch and rebuild routes template list when one of the pages changes
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 ,則所有模板都將重新生成。 |