功能请求:ReactPartialRenderer中的自定义错误处理程序

bq8i3lrv  于 2022-10-28  发布在  React
关注(0)|答案(2)|浏览(176)

我希望为ReactPartialRenderer传递自定义错误处理程序的选项。自定义处理程序应该能够指定我们是否:

  • 抛出并中止渲染(基本上与现有行为相同)
  • 返回替换元素
  • 在出错元素处暂停渲染;下一个read()调用将继续并有效地重试呈现该元素。2将输出缓冲区返回到我们暂停的位置。

我有两个使用案例:
1.返回一个替代元素可以替代SSR中的ErrorBoundary。我理解为什么ErrorBoundary由于顺序流问题而不起作用(例如componentDidCatch在React 16的renderToString #10442(注解)中不起作用)-我们不能替换整个树直到父树,但一个自定义处理程序至少可以呈现一个占位符error div或其他东西。在开发中会很有用。
1.通过暂停渲染实现一个穷人的悬念。更多下面...
看起来Suspense的设计方向是跳过服务器上挂起的组件,并呈现回退。我想改为将HTML流向上,直到遇到异步依赖,并在那里阻塞,直到依赖被解决。有一个官方的自定义错误处理程序API将使我能够在React之外实现这一点。
我能够在这个沙盒链接中拼凑出一个快速示例:https://codesandbox.io/s/node-js-forked-5lzro?file=/src/index.js的最大值
大多数复杂性来自于捕获错误、清理状态和返回正在进行的输出缓冲区内容;其余的逻辑(例如,在承诺被解析之后恢复流)可以在React之外的客户机代码中处理。
我意识到这听起来很像Suspense的用例。然而,Suspense似乎主要是以客户端为中心的,许多并发问题等在服务器上是可以避免的,而服务器上没有这些问题。由于并发模式的限制,在遗留代码库中采用Suspense是很困难的。我们不能真正利用服务器上减少的限制。因为在服务器上无法只选择Suspense。

y53ybaqx

y53ybaqx1#

Suspense的设计方向似乎是跳过服务器上挂起的组件并呈现回退
不,这是不正确的。这是一个暂时的限制,因为当前的服务器渲染器不支持正确的流。预期的设计方向(相关工作将在未来几个月内开始)是流实际内容。这需要构建一个新的服务器渲染器。
不过,《悬疑》似乎主要以客户为中心
这也不完全正确,它最初是为服务器设计的(考虑到了这个问题),但是我们已经绕了一个圈子来弄清楚客户端的语义。现在这些基本上都解决了,我们回到最初的问题。

ef1yzkbh

ef1yzkbh2#

顺便说一句,如果你在并发模式下运行,即使客户端挂起,客户端已经支持水合 * 渲染内容 *。例如,如果一个组件的代码仍在客户端加载,但服务器生成了内容HTML。现在剩下的是构建一个利用这一点的服务器渲染器。在内部,我们目前使用一个通过将多个renderToString()响应缝合在一起来模拟流的黑客。但这并不好。

相关问题