Nitro
Nuxt Kit 提供了一组实用工具,帮助你处理 Nitro。这些函数允许你添加服务器处理器、插件和预渲染路由。
Nitro 是一个用于构建超快 Web 服务器的开源 TypeScript 框架。Nuxt 使用 Nitro 作为其服务器引擎。你可以使用 useNitro
访问 Nitro 实例,addServerHandler
添加服务器处理器,addDevServerHandler
添加仅在开发模式下使用的服务器处理器,addServerPlugin
添加插件以扩展 Nitro 的运行时行为,以及 addPrerenderRoutes
添加由 Nitro 预渲染的路由。
addServerHandler
添加一个 Nitro 服务器处理器。如果想创建服务器中间件或自定义路由,可以使用此函数。
类型
function addServerHandler (handler: NitroEventHandler): void
export interface NitroEventHandler {
handler: string;
route?: string;
middleware?: boolean;
lazy?: boolean;
method?: string;
}
参数
handler
类型: NitroEventHandler
必填: true
一个包含以下属性的处理器对象:
handler
(必填)
类型:string
事件处理器的路径。route
(可选)
类型:string
路径前缀或路由。如果使用空字符串,将作为中间件使用。middleware
(可选)
类型:boolean
指定这是一个中间件处理器。中间件在每个路由上都会被调用,通常不返回任何内容以传递给下一个处理器。lazy
(可选)
类型:boolean
使用延迟加载导入处理器。method
(可选)
类型:string
路由方法匹配器。如果处理器名称包含方法名,将作为默认值使用。
示例
// https://github.com/nuxt-modules/robots
import { createResolver, defineNuxtModule, addServerHandler } from '@nuxt/kit'
export default defineNuxtModule({
setup(options) {
const resolver = createResolver(import.meta.url)
addServerHandler({
route: '/robots.txt',
handler: resolver.resolve('./runtime/robots.get')
})
}
})
export default defineEventHandler(() => {
return {
body: `User-agent: *\nDisallow: /`
}
})
addDevServerHandler
添加仅在开发模式下使用的 Nitro 服务器处理器。此处理器将从生产构建中排除。
类型
function addDevServerHandler (handler: NitroDevEventHandler): void
export interface NitroDevEventHandler {
handler: EventHandler;
route?: string;
}
参数
handler
类型: NitroEventHandler
必填: true
一个包含以下属性的处理器对象:
handler
(必填)
类型:string
事件处理器。route
(可选)
类型:string
路径前缀或路由。如果使用空字符串,将作为中间件使用。
示例
import { createResolver, defineNuxtModule, addDevServerHandler } from '@nuxt/kit'
export default defineNuxtModule({
setup() {
const resolver = createResolver(import.meta.url)
addDevServerHandler({
handler: () => {
return {
body: `Response generated at ${new Date().toISOString()}`
}
},
route: '/_handler'
})
}
})
// https://github.com/nuxt-modules/tailwindcss
import { joinURL } from 'ufo'
import { defineNuxtModule, addDevServerHandler } from '@nuxt/kit'
export default defineNuxtModule({
async setup(options) {
const route = joinURL(nuxt.options.app?.baseURL, '/_tailwind')
// @ts-ignore
const createServer = await import('tailwind-config-viewer/server/index.js').then(r => r.default || r) as any
const viewerDevMiddleware = createServer({ tailwindConfigProvider: () => options, routerPrefix: route }).asMiddleware()
addDevServerHandler({ route, handler: viewerDevMiddleware })
}
})
useNitro
返回 Nitro 实例。
只能在
ready
钩子之后调用 useNitro()
。对 Nitro 实例配置的更改不会生效。
类型
function useNitro (): Nitro
export interface Nitro {
options: NitroOptions;
scannedHandlers: NitroEventHandler[];
vfs: Record<string, string>;
hooks: Hookable<NitroHooks>;
unimport?: Unimport;
logger: ConsolaInstance;
storage: Storage;
close: () => Promise<void>;
updateConfig: (config: NitroDynamicConfig) => void | Promise<void>;
}
示例
// https://github.com/nuxt/nuxt/blob/4e05650cde31ca73be4d14b1f0d23c7854008749/packages/nuxt/src/core/nuxt.ts#L404
import { defineNuxtModule, useNitro, addPlugin, createResolver } from '@nuxt/kit'
export default defineNuxtModule({
setup(options, nuxt) {
const resolver = createResolver(import.meta.url)
nuxt.hook('ready', () => {
const nitro = useNitro()
if (nitro.options.static && nuxt.options.experimental.payloadExtraction === undefined) {
console.warn('Using experimental payload extraction for full-static output. You can opt-out by setting `experimental.payloadExtraction` to `false`.')
nuxt.options.experimental.payloadExtraction = true
}
nitro.options.replace['process.env.NUXT_PAYLOAD_EXTRACTION'] = String(!!nuxt.options.experimental.payloadExtraction)
nitro.options._config.replace!['process.env.NUXT_PAYLOAD_EXTRACTION'] = String(!!nuxt.options.experimental.payloadExtraction)
if (!nuxt.options.dev && nuxt.options.experimental.payloadExtraction) {
addPlugin(resolver.resolve(nuxt.options.appDir, 'plugins/payload.client'))
}
})
}
})
addServerPlugin
添加插件以扩展 Nitro 的运行时行为。
你可以在 Nitro 文档 中了解更多关于 Nitro 插件的信息。
类型
function addServerPlugin (plugin: string): void
参数
plugin
类型: string
必填: true
插件的路径。插件必须导出一个接受 Nitro 实例作为参数的函数。
示例
import { createResolver, defineNuxtModule, addServerPlugin } from '@nuxt/kit'
export default defineNuxtModule({
setup() {
const resolver = createResolver(import.meta.url)
addServerPlugin(resolver.resolve('./runtime/plugin.ts'))
}
})
export default defineNitroPlugin((nitroApp) => {
nitroApp.hooks.hook("request", (event) => {
console.log("on request", event.path);
});
nitroApp.hooks.hook("beforeResponse", (event, { body }) => {
console.log("on response", event.path, { body });
});
nitroApp.hooks.hook("afterResponse", (event, { body }) => {
console.log("on after response", event.path, { body });
});
});
addPrerenderRoutes
添加由 Nitro 预渲染的路由。
类型
function addPrerenderRoutes (routes: string | string[]): void
参数
routes
类型: string | string[]
必填: true
要预渲染的一个路由或路由数组。
示例
import { defineNuxtModule, addPrerenderRoutes } from '@nuxt/kit'
export default defineNuxtModule({
meta: {
name: 'nuxt-sitemap',
configKey: 'sitemap',
},
defaults: {
sitemapUrl: '/sitemap.xml',
prerender: true,
},
setup(options) {
if (options.prerender) {
addPrerenderRoutes(options.sitemapUrl)
}
}
})
addServerImportsDir
添加一个由 Nitro 扫描以进行自动导入的目录。
类型
function addServerImportsDir (dirs: string | string[], opts: { prepend?: boolean }): void
参数
dirs
类型: string | string[]
必填: true
要注册为 Nitro 扫描的一个目录或目录数组。
示例
import { defineNuxtModule, createResolver, addServerImportsDir } from '@nuxt/kit'
export default defineNuxtModule({
meta: {
name: 'my-module',
configKey: 'myModule',
},
setup(options) {
const resolver = createResolver(import.meta.url)
addServerImportsDir(resolver.resolve('./runtime/server/utils'))
}
})
addServerScanDir
添加由 Nitro 扫描的目录。它会检查子目录,这些子目录将像 ~/server
文件夹一样被注册。
类型
function addServerScanDir (dirs: string | string[], opts: { prepend?: boolean }): void
参数
dirs
类型: string | string[]
必填: true
要注册为 Nitro 扫描的服务器目录的一个目录或目录数组。
示例
import { defineNuxtModule, createResolver, addServerScanDir } from '@nuxt/kit'
export default defineNuxtModule({
meta: {
name: 'my-module',
configKey: 'myModule',
},
setup(options) {
const resolver = createResolver(import.meta.url)
addServerScanDir(resolver.resolve('./runtime/server'))
}
})