コンテンツにスキップ

Server Bundles

このコンテンツはまだ日本語訳がありません。

服务器包

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

Remix 通常会将您的服务器代码构建到一个公开单个请求处理程序函数的包中。但是,在某些情况下,您可能需要将路由树拆分为多个服务器包,这些服务器包会为部分路由公开一个请求处理程序函数。为了提供这种灵活性,Remix Vite 插件 支持serverBundles选项,该选项是一种将路由分配给不同服务器包的函数。

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

对于每条路由,此函数都会传递一个包含该路由的路由数组,称为路由分支。这允许您为路由树的不同部分创建服务器包。例如,您可以使用它来创建一个单独的服务器包,其中包含特定布局路由内的所有路由:

vite.config.ts
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.tsx 将具有 routes/gists.$usernameid
  • path — 此路由用于匹配 URL 路径名的路径。
  • file — 此路由入口点的绝对路径。
  • index — 此路由是否为索引路由。

构建清单

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

vite.config.ts
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写入磁盘。