如何在React on Rails中实现带GraphQL的SSR?有无现成方案?
React on Rails 实现带Apollo GraphQL请求组件的SSR方案
可以实现,以下是几种成熟的解决方案,适配你从Rails erb向Next.js迁移的需求:
1. 升级React on Rails到Node.js运行时版本
React on Rails现在已经支持用Node.js替代execjs/mini_racer作为渲染引擎,原生支持Promise、异步操作和定时器。只需修改配置即可启用:
- 在
config/initializers/react_on_rails.rb中配置Node runner:ReactOnRails.configure do |config| config.node_server_renderer = true # 若需指定node路径可添加: # config.node_bin = "/path/to/node" end - 启用后,组件中Apollo的Promise请求可以直接在SSR阶段执行,无需额外工具适配,同时保持React组件的封装性,后续迁移到Next.js时改动极小。
2. Rails后端预取GraphQL数据,传递给组件
如果暂时不想升级运行时,可以在Rails层提前获取GraphQL数据,再以props形式传给React组件,绕开前端异步限制:
- 控制器中预取数据:
def show # 调用GraphQL接口获取数据(可使用Rails GraphQL客户端或HTTP请求) graphql_response = HTTP.post( "your-graphql-api-url", json: { query: "YOUR_QUERY_STRING", variables: { id: params[:id] } } ).parse @initial_data = graphql_response["data"] end - ERB中渲染组件时传入初始数据:
<%= react_component("YourApolloComponent", props: { initialData: @initial_data }) %> - React组件中利用
initialData初始化Apollo查询:import { useQuery } from "@apollo/client"; import YOUR_QUERY from "./your-query.graphql"; const YourApolloComponent = ({ initialData }) => { const { data } = useQuery(YOUR_QUERY, { initialData }); // 渲染逻辑 return <div>{data?.yourField}</div>; }; export default YourApolloComponent;
这种方式保持组件独立性,后续迁移到Next.js时,只需把数据预取逻辑移到getServerSideProps或getStaticProps中即可。
3. 渐进式迁移:用Next.js先实现部分SSR页面
既然最终要迁移到Next.js,可以先搭建独立的Next.js服务,将需要SSR的封装式React组件放在Next.js中开发,通过以下方式与现有Rails应用集成:
- 在Next.js中按照官方文档集成Apollo SSR,利用
getServerSideProps在服务端执行GraphQL请求并传递数据给组件; - Rails erb通过反向代理或iframe嵌入Next.js生成的SSR页面;
- 逐步替换Rails erb页面为Next.js页面,最终完成迁移。这种方式直接复用后续要迁移的组件,避免重复开发。
内容的提问来源于stack exchange,提问作者aspirisen
相关产品推荐
相关产品推荐

