插件

使用插件来扩展 Nitro 的运行时行为。

Nitro 插件在服务器启动期间执行一次,以允许扩展 Nitro 的运行时行为。 它们接收 nitroApp 上下文,可用于挂载到生命周期事件。

插件从 plugins/ 目录自动注册,并在第一次 Nitro 初始化时按文件名顺序同步运行。插件函数本身必须是同步的(返回 void),但它们注册的钩子可以是异步的。

示例:

plugins/test.ts
import { definePlugin } from "nitro";

export default definePlugin((nitroApp) => {
  console.log('Nitro plugin', nitroApp)
})

如果你有其他目录中的插件,可以使用 plugins 选项:

nitro.config.ts
import { defineNitroConfig } from "nitro/config";

export default defineNitroConfig({
  plugins: ['my-plugins/hello.ts']
})

nitroApp 上下文

插件函数接收一个具有以下属性的 nitroApp 对象:

属性类型描述
hooksHookableCore用于注册生命周期回调的钩子系统。
h3H3Core底层的 H3 应用实例。
fetch(req: Request) => Response | Promise<Response>应用的内部 fetch 处理器。
captureError(error: Error, context) => void以编程方式将错误捕获到错误钩子管道中。

Nitro 运行时钩子

你可以使用 Nitro 钩子 在插件中将自定义函数注册到生命周期事件,以扩展 Nitro 的默认运行时行为。

示例:

import { definePlugin } from "nitro";

export default definePlugin((nitroApp) => {
  nitroApp.hooks.hook("close", async () => {
    // 当 nitro 关闭时运行
  });
})

可用的钩子

钩子签名描述
request(event: HTTPEvent) => void | Promise<void>在每个请求开始时调用。
response(res: Response, event: HTTPEvent) => void | Promise<void>在响应创建后调用。
error(error: Error, context: { event?: HTTPEvent, tags?: string[] }) => void当错误被捕获时调用。
close() => void当 Nitro 服务器关闭时调用。
NitroRuntimeHooks 接口是可扩展的。部署预设(如 Cloudflare)可以使用平台特定的钩子(如 cloudflare:scheduledcloudflare:email)来扩展它。

注销钩子

hook() 方法返回一个注销函数,可以调用该函数来移除钩子:

import { definePlugin } from "nitro";

export default definePlugin((nitroApp) => {
  const unregister = nitroApp.hooks.hook("request", (event) => {
    // ......
  });

  // 稍后,移除该钩子
  unregister();
});

示例

捕获错误

你可以使用插件来捕获所有应用错误。

import { definePlugin } from "nitro";

export default definePlugin((nitroApp) => {
  nitroApp.hooks.hook("error", async (error, { event }) => {
    console.error(`${event?.path} Application error:`, error)
  });
})

context 对象包含一个可选的 tags 数组,用于标识错误来源(例如 "request""response""cache""plugin""unhandledRejection""uncaughtException")。

以编程方式捕获错误

你可以使用 captureError 手动将错误送入错误钩子管道:

import { definePlugin } from "nitro";

export default definePlugin((nitroApp) => {
  nitroApp.captureError(new Error("something went wrong"), {
    tags: ["startup"],
  });
});

优雅关闭

服务器将优雅地关闭,并等待由 event.waitUntil 发起的任何后台待处理任务。

import { definePlugin } from "nitro";

export default definePlugin((nitroApp) => {
  nitroApp.hooks.hook("close", async () => {
    // 清理资源、关闭连接等。
  });
});

请求和响应生命周期

你可以使用插件来注册在请求生命周期中运行的钩子:

import { definePlugin } from "nitro";

export default definePlugin((nitroApp) => {
  nitroApp.hooks.hook("request", (event) => {
    console.log("on request", event.path);
  });

  nitroApp.hooks.hook("response", (res, event) => {
    // 修改或检查响应
    console.log("on response", res.status);
  });
});

修改响应头

import { definePlugin } from "nitro";

export default definePlugin((nitroApp) => {
  nitroApp.hooks.hook("response", (res, event) => {
    const { pathname } = new URL(event.req.url);
    if (pathname.endsWith(".css") || pathname.endsWith(".js")) {
      res.headers.append("Vary", "Origin");
    }
  });
});