嵌套应用

H3 具有一个原生的 mount 方法,用于将嵌套的子应用添加到主实例中。

通常,H3 项目由一个或多个文件中定义的多个事件处理器组成(甚至可以懒加载,以加快启动速度)。

有时将多个 H3 实例结合起来,或者使用其他团队使用的 HTTP 框架并将其挂载到主应用实例,会更加方便。H3 提供了一个原生的 .mount 方法来实现这一点。

嵌套的 H3 应用

H3 原生支持挂载子应用。挂载后,子应用的路由和中间件会与基础 URL 前缀合并到主应用实例中。

import { H3, serve } from "h3";

const nestedApp = new H3()
  .use((event) => {
    event.res.headers.set("x-api", "1");
  })
  .get("/**:slug", (event) => ({
    pathname: event.url.pathname,
    slug: event.context.params?.slug,
  }));

const app = new H3().mount("/api", nestedApp);

在上例中,当访问 /api/test URL 时,pathname 将是 /api/test(实际路径),而 slug 将是 /test(通配符参数)。

全局配置和钩子不会从嵌套应用中继承。请考虑始终从主应用中设置它们。

嵌套的 Web 标准应用

将一个兼容 .fetch 的服务器实例(例如 HonoElysia)挂载到基础 URL 下。

传递给被挂载应用的 request.url 会移除基础前缀。
import { H3 } from "h3";
import { Hono } from "hono";
import { Elysia } from "elysia";

const app = new H3()
  .mount(
    "/elysia",
    new Elysia().get("/test", () => "Hello Elysia!"),
  )
  .mount(
    "/hono",
    new Hono().get("/test", (c) => c.text("Hello Hono!")),
  );
类似地,你可以在 HonoElysia 中挂载 H3 应用。