SuperAPI AI 工具集

bun-react-ssr

前端与建站

查看项目

更新于 10-15 15:38

技能介绍

用途

bun-react-ssr 用于在 Bun 运行时中构建自定义的服务端渲染(SSR)React 应用,不依赖 Next.js 等框架。它适合需要完全掌控渲染流程、希望利用 Bun 内置能力(如 Bun.serve、Bun.build、bun:sqlite)来搭建轻量 SSR 服务的场景。

主要能力

  • 基础 SSR:使用 react-dom/server 的 renderToString 在服务端渲染 React 组件,返回完整 HTML 文档。
  • 客户端水合:使用 react-dom/client 的 hydrateRoot 在浏览器端接管服务端生成的 HTML。
  • 流式 SSR:使用 renderToReadableStream 配合 bootstrapScripts 和 onError,实现流式响应,并通过 stream.allReady 等待 Suspense 边界就绪。
  • Suspense 支持:在组件树中使用 Suspense 与 fallback,实现渐进式加载。
  • 服务端数据获取:在服务端查询数据(示例使用 bun:sqlite 的 Database),将初始数据通过 props 传入组件,并注入到 window.INITIAL_DATA 供客户端水合使用。
  • 简单路由:提供基于 useState、useEffect 和 popstate 事件的客户端路由示例,以及 Link 组件。
  • CSS 处理:支持将 CSS 内联到 HTML 的 style 标签,或通过 Bun.build 构建外部样式表并在 HTML 中引用。
  • 开发与构建:提供基于 fs.watch 与 Bun.spawn 的热重载开发脚本,以及分别构建客户端(target: browser)和服务端(target: bun)的生产构建脚本。

使用方式

快速开始:

mkdir my-ssr-app && cd my-ssr-app
bun init
bun add react react-dom
bun add -D @types/react @types/react-dom

基础 SSR 需要三个文件:服务端入口 src/server.tsx(使用 Bun.serve 与 renderToString)、客户端入口 src/client.tsx(使用 hydrateRoot)、以及 React 应用 src/App.tsx。客户端 bundle 通过 Bun.build 构建,指定 entrypoints、outdir、target: "browser"、minify 和 splitting。

流式 SSR 使用 renderToReadableStream,并在选项中传入 bootstrapScripts 与 onError 回调。

数据获取示例中,服务端使用 bun:sqlite 查询数据,将结果作为 initialData 传入组件,并在 HTML 中通过内联 script 写入 window.INITIAL_DATA,客户端读取该全局变量后传给 hydrateRoot。

路由示例通过 useState 保存当前路径,监听 popstate 事件更新路径,Link 组件使用 history.pushState 并手动派发 PopStateEvent。

CSS 可以内联(读取 CSS 文件文本放入 style 标签),也可以构建为外部样式表并通过 link 标签引用。

开发热重载脚本使用 fs.watch 监听 src 目录,变更时通过 Bun.spawn 重启服务端进程。

生产构建分别构建客户端(输出到 dist/public/static,target: browser,minify,splitting,sourcemap: external)和服务端(输出到 dist,target: bun,minify)。

适用场景

  • 希望用 Bun 搭建无框架、可完全自定义的 React SSR 应用。
  • 需要流式 SSR 与 Suspense 渐进加载以优化首字节时间(TTFB)。
  • 需要在服务端直接访问数据库(如 bun:sqlite)并将数据注入客户端水合。
  • 需要轻量级客户端路由与 CSS 处理方案。
  • 需要自定义开发热重载与生产构建流程。

限制与注意事项

  • 该技能不依赖框架,路由、数据获取、缓存等均需自行实现,示例仅提供基础模式。
  • 常见错误包括:水合不匹配(服务端与客户端 HTML 不一致,需检查初始状态)、document is not defined(SSR 中访问 DOM,需用 typeof window 守卫)、hooks 使用位置错误、未样式化内容闪烁(CSS 未加载,可内联关键 CSS)。
  • 性能建议包括:使用流式 SSR 提升 TTFB、内联首屏关键 CSS、对客户端 bundle 做代码分割、缓存静态页面渲染结果、使用 Suspense 实现渐进加载。
  • 参考资料 references/streaming-patterns.md 涉及复杂 Suspense 边界、选择性水合、渐进增强;references/caching.md 涉及 HTML 缓存策略、CDN 集成、边缘渲染。
  • 关于收费、价格、平台支持范围等具体信息,资料中暂未提供。