Nitro
Nitro 是一个开源的 TypeScript 框架,用于构建超快速的 веб 服务器。Nuxt 使用 Nitro 作为其服务器引擎。您可以使用 useNitro
来访问 Nitro 实例,使用 addServerHandler
添加服务器处理程序,使用 addDevServerHandler
添加仅在开发模式下使用的服务器处理程序,使用 addServerPlugin
添加插件以扩展 Nitro 的运行时行为,以及使用 addPrerenderRoutes
添加要由 Nitro 预渲染的路由。
addServerHandler
添加一个 Nitro 服务器处理程序。如果您想要创建服务器中间件或自定义路由,请使用此方法。
使用方法
import { createResolver, defineNuxtModule, addServerHandler } from '@nuxt/kit'
export default defineNuxtModule({
setup(options) {
const { resolve } = createResolver(import.meta.url)
addServerHandler({
route: '/robots.txt',
handler: resolve('./runtime/robots.get')
})
}
})
类型
function addServerHandler (handler: NitroEventHandler): void
参数
handler: 一个具有以下属性的处理程序对象:
属性 | 类型 | 是否必需 | 描述 |
---|---|---|---|
handler | string | true | 事件处理程序的路径。 |
route | string | false | 路径前缀或路由。如果使用空字符串,将作为中间件使用。 |
middleware | boolean | false | 指定这是一个中间件处理程序。中间件在每个路由上调用,通常应返回空值以传递给下一个处理程序。 |
lazy | boolean | false | 使用懒加载来导入处理程序。当您只希望按需加载处理程序时,这非常有用。 |
method | string | false | 路由方法匹配器。如果处理程序名称包含方法名称,则将其用作默认值。 |
示例
基本使用
您可以使用 addServerHandler
从模块中添加服务器处理程序。
import { createResolver, defineNuxtModule, addServerHandler } from '@nuxt/kit'
export default defineNuxtModule({
setup(options) {
const { resolve } = createResolver(import.meta.url)
addServerHandler({
route: '/robots.txt',
handler: resolve('./runtime/robots.get')
})
}
})
export default defineEventHandler(() => {
return {
body: `User-agent: *\nDisallow: /`
}
})
当您访问 /robots.txt
时,将返回以下响应:
User-agent: *
Disallow: /
addDevServerHandler
添加一个仅在开发模式下使用的 Nitro 服务器处理程序。此处理程序将从生产构建中排除。
使用方法
import { defineEventHandler } from 'h3'
import { createResolver, defineNuxtModule, addDevServerHandler } from '@nuxt/kit'
export default defineNuxtModule({
setup() {
addDevServerHandler({
handler: defineEventHandler(() => {
return {
body: `Response generated at ${new Date().toISOString()}`
}
}),
route: '/_handler'
})
}
})
类型
function addDevServerHandler (handler: NitroDevEventHandler): void
参数
handler: 一个具有以下属性的处理程序对象:
属性 | 类型 | 是否必需 | 描述 |
---|---|---|---|
handler | EventHandler | true | 事件处理程序。 |
route | string | false | 路径前缀或路由。如果使用空字符串,将作为中间件使用。 |
示例
基本使用
在某些情况下,您可能希望创建一个专门用于开发目的的服务器处理程序,例如 Tailwind 配置查看器。
import { joinURL } from 'ufo'
import { defineNuxtModule, addDevServerHandler } from '@nuxt/kit'
export default defineNuxtModule({
async setup(options, nuxt) {
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()
。使用方法
import { defineNuxtModule, useNitro } from '@nuxt/kit'
export default defineNuxtModule({
setup(options, nuxt) {
const resolver = createResolver(import.meta.url)
nuxt.hook('ready', () => {
const nitro = useNitro()
// 对 Nitro 实例执行操作
})
}
})
类型
function useNitro (): Nitro
addServerPlugin
添加插件以扩展 Nitro 的运行时行为。
使用方法
import { createResolver, defineNuxtModule, addServerPlugin } from '@nuxt/kit'
export default defineNuxtModule({
setup() {
const { resolve } = createResolver(import.meta.url)
addServerPlugin(resolve('./runtime/plugin.ts'))
}
})
类型
function addServerPlugin (plugin: string): void
参数
属性 | 类型 | 是否必需 | 描述 |
---|---|---|---|
plugin | string | true | 插件的路径。该插件必须导出一个接受 Nitro 实例作为参数的默认函数。 |
示例
import { createResolver, defineNuxtModule, addServerPlugin } from '@nuxt/kit'
export default defineNuxtModule({
setup() {
const { resolve } = createResolver(import.meta.url)
addServerPlugin(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 的路由。
使用方法
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)
}
}
})
类型
function addPrerenderRoutes (routes: string | string[]): void
参数
属性 | 类型 | 是否必需 | 描述 |
---|---|---|---|
routes | string | string[] | true | 要预渲染的路由或路由数组。 |
addServerImportsDir
添加一个目录以供 Nitro 自动导入扫描。
使用方法
import { defineNuxtModule, createResolver, addServerImportsDir } from '@nuxt/kit'
export default defineNuxtModule({
meta: {
name: 'my-module',
configKey: 'myModule',
},
setup(options) {
const { resolve } = createResolver(import.meta.url)
addServerImportsDir(resolve('./runtime/server/composables'))
}
})
类型
function addServerImportsDir (dirs: string | string[], opts: { prepend?: boolean }): void
参数
属性 | 类型 | 是否必需 | 描述 |
---|---|---|---|
dirs | string | string[] | true | 要注册的目录或目录数组,这些目录将被 Nitro 扫描。 |
opts | { prepend?: boolean } | false | 导入目录的选项。如果 prepend 为 true ,则该目录将添加到扫描列表的开头。 |
示例
您可以使用 addServerImportsDir
添加一个目录以供 Nitro 扫描。这在您希望 Nitro 自动导入自定义服务器目录中的函数时非常有用。
import { defineNuxtModule, createResolver, addServerImportsDir } from '@nuxt/kit'
export default defineNuxtModule({
meta: {
name: 'my-module',
configKey: 'myModule',
},
setup(options) {
const { resolve } = createResolver(import.meta.url)
addServerImportsDir(resolve('./runtime/server/composables'))
}
})
export function useApiSecret() {
const { apiSecret } = useRuntimeConfig()
return apiSecret
}
然后,您可以在服务器代码中使用 useApiSecret
函数:
export default defineEventHandler(() => {
const apiSecret = useApiSecret()
// 对 apiSecret 执行操作
})
addServerScanDir
添加要被 Nitro 扫描的目录。它将检查子目录,像 ~/server
文件夹一样注册。
~/server/api
、~/server/routes
、~/server/middleware
、和 ~/server/utils
会被扫描。使用方法
import { defineNuxtModule, createResolver, addServerScanDir } from '@nuxt/kit'
export default defineNuxtModule({
meta: {
name: 'my-module',
configKey: 'myModule',
},
setup(options) {
const { resolve } = createResolver(import.meta.url)
addServerScanDir(resolve('./runtime/server'))
}
})
类型
function addServerScanDir (dirs: string | string[], opts: { prepend?: boolean }): void
参数
属性 | 类型 | 是否必需 | 描述 |
---|---|---|---|
dirs | string | string[] | true | 要作为服务器目录注册的目录或目录数组,供 Nitro 扫描。 |
opts | { prepend?: boolean } | false | 导入目录的选项。如果 prepend 为 true ,则该目录将添加到扫描列表的开头。 |
示例
您可以使用 addServerScanDir
添加一个目录以供 Nitro 扫描。这在您希望添加自定义服务器目录时非常有用。
import { defineNuxtModule, createResolver, addServerScanDir } from '@nuxt/kit'
export default defineNuxtModule({
meta: {
name: 'my-module',
configKey: 'myModule',
},
setup(options) {
const { resolve } = createResolver(import.meta.url)
addServerScanDir(resolve('./runtime/server'))
}
})
export function hello() {
return 'Hello from server utils!'
}
然后,您可以在服务器代码中使用 hello
函数。
export default defineEventHandler(() => {
return hello() // Hello from server utils!
})