【发布时间】:2022-12-06 18:40:53
【问题描述】:
我试图使用 Node、Express 和 React18 功能进行服务器端渲染。我使用的方法是renderToPipeableStream而不是 renderToString。
代码链接 -
- GITHUB : https://github.com/ranjanrnj44/react-ssr/tree/master
- CODESANDBX:https://codesandbox.io/s/react-ssr-9x9ohn
笔记 :
- 请下载代码并从本地机器运行。我提供了 package.json 文件来安装所有依赖项
- 现在,对于服务器端的任何代码更改,我正在生成一个构建文件(请查看脚本第 25 行和第 28 行下的 package.json)
- server.js 更改后请尝试运行npm 运行构建其次是npm 运行 ssr(现在您会注意到应用程序正在 localhost:3001/one 上运行)
问题 :
- 我收到这样的消息Hydration 失败,因为初始 UI 与服务器上呈现的内容不匹配.
- 服务器生成的 HTML 文件没有包含(html、head、meta、body 标签)的整个部分。
- 在 renderToString 方法中我们可以使用 replace 方法来注入数据但在这里,我正在流式传输 html(stream- nodejs 部分)
- 我无法在根文件之间注入数据块(即理想情况下
<div id="root"> <!-received chunk data should inject here-></div>)
我试过什么:
- 我尝试发送硬编码拆分方法并注入响应(不幸的是我收到 [object][Object] 错误)。
- 还尝试使用回复到 stream.pipe()。它不起作用。
请为我提供匹配服务器生成的 HTML 和客户端 HTML 的解决方案,以便我可以滋润 UI。
【问题讨论】:
-
当您深入浏览器中的错误堆栈时,您可以找到原因。第一个问题是 const UserListFetch = lazy(() => import("./components/UserListFetch")); 的导入您的示例中只存在一个 UserFetch 文件。第二个问题是,在 UserListSSR 中,未填充 fetchedData 并且您映射了未定义的对象。我希望你能继续下去。总而言之,水合作用不匹配似乎是一个必然的错误。 PS:你调用下载代码到本地系统好像有点像垃圾邮件;)
-
谢谢 Marcel,我试过了,还使用了连接方法来绑定结构。它奏效了,不幸的是水合作用没有发生。
标签: javascript node.js reactjs react-18 react-ssr