@cwagner22/react-router-hono
Version:
React Router Hono Server
169 lines (122 loc) • 4.49 kB
Markdown
[](README.md)
React Router Hono 服务包
- [开发服务器](
- [Node.js 服务](
- [Vercel 服务](
- [Hono 中间件](
- [React Router 负载上下文](
```bash
pnpm add -D @resolid/react-router-hono
```
```bash
pnpm add hono @hono/node-server
```
修改 vite.config.ts 配置开发服务器
```ts
// vite.config.ts
import { reactRouter } from "@react-router/dev/vite";
import { reactRouterHonoServer } from "@resolid/react-router-hono/dev";
import { defineConfig } from "vite";
import tsconfigPaths from "vite-tsconfig-paths";
export default defineConfig({
plugins: [
reactRouterHonoServer({
// 入口文件
entryFile: "server.node.ts", // 默认为 server.ts
}),
reactRouter(),
tsconfigPaths(),
],
});
```
```ts
// app/server.node.ts
import { createHonoNodeServer } from "@resolid/react-router-hono/node-server";
export default await createHonoNodeServer();
```
```ts
// react-router.config.ts
import type { Config } from "@react-router/dev/config";
import { nodePreset } from "@resolid/react-router-hono/node-preset";
export default {
presets: [
nodePreset({
// 入口文件
entryFile: "server.node.ts", // 默认为 server.ts
nodeVersion: 22, // 默认为 22
}),
],
} satisfies Config;
```
支持 `SERVER_PORT` 和 `SERVER_PATH` 环境变量, `SERVER_PATH` 环境变量用于 React Router 的 serverBundles 功能
> 运行 build 成功以后自动会在 `build/server` 目录下生成 `server.mjs` 和 `package.json` 文件, `package.json` 文件里面定义了
> Vite 设置的 `ssr.external`, 在服务器目录下运行 `npm install` 即可安装构建时排除的依赖
> 你可以使用 https://github.com/huijiewei/react-router-hono-vercel-template 模版快速部署到 Vercel.
```ts
// app/server.vercel.ts
import { createHonoVercelServer } from "@resolid/react-router-hono/vercel-server";
export default await createHonoVercelServer();
```
```ts
// react-router.config.ts
import type { Config } from "@react-router/dev/config";
import { vercelPreset } from "@resolid/remix-plugins/vercel-preset";
export default {
presets: [
vercelPreset({
// 部署区域
regions: ["sin1"],
// 有些包会根据不同平台引入二进制包, 安装的时候二进制包不在同一目录, 比如 @node-rs/bcrypt
copyParentModules: ["@node-rs/bcrypt"],
// 入口文件
entryFile: "server.vercel.ts", // 默认为 server.ts
nodeVersion: 22, // 默认为 22
}),
],
} satisfies Config;
```
> Vercel 项目 Framework Preset 需设置为 Vite, Node.js Version 需设置为一样
>
> 如果你使用的是 monorepo 结构, 请设置 Root Directory 为需要部署的项目目录,
> 然后自定义相关命令, [Resolid](https://github.com/huijiewei/resolid) 的配置如下图
> 
中间件是在 React Router 调用加载器/操作之前调用的函数, 请参阅 [Hono 文档](https://hono.dev/docs/guides/middleware) 以获取更多信息。
你可以配置 createHonoNodeServer 或者 createHonoVercelServer 的 configure 来方便使用 Hono 中间件
```ts
import { createHonoNodeServer } from "@resolid/react-router-hono/node-server";
export default await createHonoNodeServer({
configure: (server) => {
server.use(/* Hono 中间件 */);
},
});
```
如果您想向 React Router 加载上下文添加其他属性,你可以配置 createHonoNodeServer 或者 createHonoVercelServer 的 getLoadContext
来增加加载上下文
```ts
import { createHonoNodeServer } from "@resolid/react-router-hono/node-server";
import type { HttpBindings } from "@hono/node-server";
import type { Context } from "hono";
export default await createHonoNodeServer({
getLoadContext: (c: Context<{ Bindings: HttpBindings }>) => {
return {
remoteAddress: c.env.incoming.socket.remoteAddress,
};
},
});
```
- [@hono/vite-dev-server](https://github.com/honojs/vite-plugins/tree/main/packages/dev-server)
- [react-router-hono-server](https://github.com/rphlmr/react-router-hono-server)