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.tsx
的 id
将为 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 映射到包的 id
和 file
的对象。routeIdToServerBundleId
— 一个将路由 ID 映射到其服务器包 ID 的对象。routes
— 一个将路由 ID 映射到路由元数据的路由清单。这可用于驱动 Remix 请求处理程序前面的自定义路由层。或者,你可以在 Vite 插件上启用 manifest
选项,将此构建清单对象作为 .remix/manifest.json
写入构建目录中的磁盘。