React Router v7 已发布。 查看文档
服务器捆绑

服务器包

这是一个为托管服务提供商集成设计的高级功能。当将你的应用程序编译成多个服务器包时,需要在你的应用程序前面有一个自定义的路由层,将请求定向到正确的包。

Remix 通常会将你的服务器代码构建到一个暴露单个请求处理函数的包中。但是,在某些情况下,你可能希望将你的路由树拆分为多个服务器包,这些包为路由的子集暴露一个请求处理函数。为了提供这种级别的灵活性,Remix Vite 插件支持 serverBundles 选项,该选项是一个用于将路由分配给不同服务器包的函数。

为树中的每个路由调用提供的 serverBundles 函数(除了那些不可寻址的路由,例如无路径的布局路由),并返回你想要将其分配到的服务器包 ID。这些包 ID 将用作你的服务器构建目录中的目录名称。

对于每个路由,此函数都传递一个导致该路由的路由数组,包括该路由本身,称为路由 branch(分支)。这允许你为路由树的不同部分创建服务器包。例如,你可以使用它来创建一个单独的服务器包,其中包含特定布局路由中的所有路由

import { vitePlugin as remix } from "@remix-run/dev";
import { defineConfig } from "vite";

export default defineConfig({
  plugins: [
    remix({
      serverBundles: ({ branch }) => {
        const isAuthenticatedRoute = branch.some((route) =>
          route.id.split("/").includes("_authenticated")
        );

        return isAuthenticatedRoute
          ? "authenticated"
          : "unauthenticated";
      },
    }),
  ],
});

branch 数组中的每个 route(路由)都包含以下属性

  • id — 此路由的唯一 ID,命名方式类似于其 file(文件),但相对于应用程序目录且不带扩展名,例如 app/routes/gists.$username.tsxid 将为 routes/gists.$username
  • path — 此路由用于匹配 URL 路径名的路径。
  • file — 此路由入口点的绝对路径。
  • index — 此路由是否为索引路由。

构建清单

构建完成后,Remix 将调用 Vite 插件的 buildEnd 钩子,传递一个 buildManifest 对象。如果你需要检查构建清单以确定如何将请求路由到正确的服务器包,这将非常有用。

import { vitePlugin as remix } from "@remix-run/dev";
import { defineConfig } from "vite";

export default defineConfig({
  plugins: [
    remix({
      // ...
      buildEnd: async ({ buildManifest }) => {
        // ...
      },
    }),
  ],
});

当使用服务器包时,构建清单包含以下属性

  • serverBundles — 一个将包 ID 映射到包的 idfile 的对象。
  • routeIdToServerBundleId — 一个将路由 ID 映射到其服务器包 ID 的对象。
  • routes — 一个将路由 ID 映射到路由元数据的路由清单。这可用于驱动 Remix 请求处理程序前面的自定义路由层。

或者,你可以在 Vite 插件上启用 manifest 选项,将此构建清单对象作为 .remix/manifest.json 写入构建目录中的磁盘。

文档和示例根据 MIT