React Router 配置 支持一个 presets
选项,以便与其它工具和托管提供商集成。
预设 只能做两件事
每个预设返回的配置会按照预设定义的顺序进行合并。任何直接在你的 React Router 配置中指定的配置将在最后合并。这意味着你的配置将始终优先于任何预设。
作为一个基本示例,让我们创建一个配置 服务器捆绑包函数 的预设。
import type { Preset } from "@react-router/dev/config";
export function myCoolPreset(): Preset {
return {
name: "my-cool-preset",
reactRouterConfig: () => ({
serverBundles: ({ branch }) => {
const isAuthenticatedRoute = branch.some((route) =>
route.id.split("/").includes("_authenticated"),
);
return isAuthenticatedRoute
? "authenticated"
: "unauthenticated";
},
}),
};
}
请记住,其他预设和用户配置仍然可以覆盖你的预设返回的值。
在我们的示例预设中,serverBundles
函数可能会被一个不同的、有冲突的实现覆盖。如果我们想验证最终解析的配置包含我们预设中的 serverBundles
函数,我们可以使用 reactRouterConfigResolved
钩子。
import type {
Preset,
ServerBundlesFunction,
} from "@react-router/dev/config";
const serverBundles: ServerBundlesFunction = ({
branch,
}) => {
const isAuthenticatedRoute = branch.some((route) =>
route.id.split("/").includes("_authenticated"),
);
return isAuthenticatedRoute
? "authenticated"
: "unauthenticated";
};
export function myCoolPreset(): Preset {
return {
name: "my-cool-preset",
reactRouterConfig: () => ({ serverBundles }),
reactRouterConfigResolved: ({ reactRouterConfig }) => {
if (
reactRouterConfig.serverBundles !== serverBundles
) {
throw new Error("`serverBundles` was overridden!");
}
},
};
}
只有在合并或覆盖你的预设配置会导致错误时,才应使用 reactRouterConfigResolved
钩子。
预设旨在发布到 npm 并在你的 React Router 配置中使用。
import type { Config } from "@react-router/dev/config";
import { myCoolPreset } from "react-router-preset-cool";
export default {
// ...
presets: [myCoolPreset()],
} satisfies Config;