寻求ASP.NET Core 6 Razor Pages整合React SSR的可行方案
在ASP.NET Core Razor Pages中整合React的现代可行方案(.NET 6+)
针对你遇到的InertiaJs停更、旧SSR包过时的问题,以下是几个适用于.NET 6及以上版本的整合方案:
原生工具链整合(最推荐)
.NET 6及以后版本官方支持与React项目的协同工作,步骤如下:- 新建Razor Pages项目,然后在项目目录下用
npx create-react-app ClientApp创建React客户端项目 - 修改React项目的
package.json,将构建输出目录设为Razor Pages项目的wwwroot/react - 在Razor Pages的
Program.cs中添加静态文件中间件,确保能访问React构建资源:app.UseStaticFiles(); // 额外配置React静态资源访问 app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "react")), RequestPath = "/react" }); - 在需要嵌入React的Razor页面(比如
Index.cshtml)中,添加React根节点并引入构建后的脚本:<div id="react-root"></div> <script src="/react/static/js/main.[hash].js"></script> <link rel="stylesheet" href="/react/static/css/main.[hash].css"> - 若需要从Razor Pages传递数据到React,可在页面中注入全局变量:
之后在React中直接读取<script> window.pageData = @Json.Serialize(Model.Data); </script>window.pageData即可。
- 新建Razor Pages项目,然后在项目目录下用
Razor Pages作为API层,React独立部署
这种方式将前后端职责分离,维护性更强:- 在Razor Pages项目中,通过
PageModel的OnGetAsync/OnPostAsync方法暴露API接口,或者直接添加API控制器 - 独立开发React项目,使用axios/fetch等工具调用Razor Pages提供的接口
- React项目打包后可部署到Razor Pages的
wwwroot目录,或单独部署,通过配置CORS解决跨域问题(在Program.cs中添加app.UseCors()配置)
- 在Razor Pages项目中,通过
自定义轻量SSR实现
若需要SSR但找不到现成包,可以自行基于React 18+的新API实现:- 使用
Jering.Javascript.NodeJS这个NuGet包(替代过时的NodeServices),在.NET中调用Node.js执行React SSR - 编写Node.js脚本,利用React的
renderToPipeableStream(流式渲染)或renderToString将组件渲染为HTML字符串 - 在Razor Pages的
PageModel中调用该脚本,将渲染后的HTML注入到页面中,并添加客户端hydration脚本完成激活
- 使用
另外,.NET 8的Blazor Web App也支持混合渲染模式,你可以在同一个项目中同时使用Razor Pages和React,通过JS互操作实现数据传递,这也是一个值得尝试的方向。
内容的提问来源于stack exchange,提问作者Wesley McGhee
相关产品推荐
相关产品推荐

