React官方对于在render函数内部抛出Promise的立场是什么?

22
React中有一个新的酷炫功能——Suspense组件。目前官方只支持使用React.lazy函数创建的组件。但是非官方地,众所周知,Suspense组件是通过在渲染树深处抛出promise来触发的,并且已经有一些库采用了这种技术,以带来新的酷炫开发者体验,例如:
- react-i18next - react-relay - react-query 此外,还有一个核心的React包react-cache也在使用它(当然是非官方的)。
考虑到所有这些,我有点困惑,因为在React文档中没有任何提到抛出promises(换句话说是什么触发了Suspense组件),但同时也有很多讨论和使用它的库。在Twitter讨论中,dan abramov回复说API可能会更改。但情况仍然令人困惑。
所以问题是:现在在生产环境中使用这种技术是否安全?如果不安全,那么我该如何使用已经采用它的库(甚至是基于Facebook的)?最后,如果API(抛出Promise)将来会发生变化,我能否确信只需要在自己的实现中进行微小的更改?
谢谢大家!
更新
根据这些问题(onetwo),似乎他们仍然不确定未来的API。很可能他们会提供一个公共API(可能是react-cache或更一般的东西),它本质上只是一个围绕着抛出Promise机制的包装器。
2个回答

10

简短回答

不安全,即使其他库使用它,你也不应该基于React内部编写代码(尤其是在生产环境中)。

长篇回答

那些使用React内部的库可能会推出与每个新版本的React兼容的新版本 - 这是维护者的工作。

你可能会遇到的问题是,维护者可能不会更新他们的库以支持最新版本的React,这将使你停留在旧版React上。

无论如何,在像relay这样的情况下,你可以使用该库而不必过多担心维护问题。relay之类的库被Facebook大量使用(至少根据我所知),因此维护不会成为问题。

在应用程序中使用React内部

那是一个非常糟糕的想法(在我看来)。 如果你想这样做,那就意味着你需要跟进React内部。 如果悬挂API的API发生变化(它们会),则需要重写使用该API的所有组件才能升级React,这并不好玩。

如果你想听我的建议:坚持使用官方版本的React。


1
感谢您的回复。 我同意您的观点。由于许多流行的库已经在使用它,情况变得越来越危险。我希望最终低级API保持不变,并且他们只提供稳定的公共API。 - Alexandr Yushkov

0

在2022年,你可以通过扔出Promise来触发Suspense

const Component = () => {

  // this trigger ErrorBoundary
  throw new Error()

  // this trigger Suspense
  throw new Promise()

}

如果传入的对象具有.then方法,React将认为它是一个Promise。

现在它是否得到了官方支持和文档支持? - Bergi
这是官方的消息,随着 React 18 的发布,新增了一个名为“resource”的文档。 - Иван Вольнов
@Bergi 我认为这个不会改变 https://zh-hans.reactjs.org/docs/concurrent-mode-suspense.html - Иван Вольнов
1
你的回答可以通过提供额外的支持信息来改进。请[编辑]以添加更多细节,例如引用或文档,以便他人可以确认您的答案是正确的。您可以在帮助中心中找到有关撰写良好答案的更多信息。 - Community
1
嗨,伊万,我不确定它是否正式,因为在React文档中仍标记为实验性功能。我能找到的唯一提及是https://reactjs.org/blog/2022/03/29/react-v18.html#suspense-in-data-frameworks,他们指出仍不建议使用。 - Alexandr Yushkov
现在有一些第三方库正式支持Suspense(例如Next.js),但我仍然没有找到任何关于如何将其用于任意数据获取的官方文档(即API的实际工作原理)。 - jtbandes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接