React.js的最大优势之一应该是服务器端渲染。问题在于密钥功能React.renderComponentToString()
是同步的,这使得在服务器上呈现组件层次结构时无法加载任何异步数据。
假设我有一个通用的注释组件,可以将其放置在页面上的任意位置。它只有一个属性,某种标识符(例如,放置评论的文章ID),其他所有内容都由组件本身处理(加载,添加,管理评论)。
我真的很喜欢 Flux架构,因为它使许多事情变得容易得多,并且它的存储非常适合在服务器和客户端之间共享状态。初始化包含评论的商店后,我可以对其进行序列化并将其从服务器发送到易于还原的客户端。
问题是填充我的商店的最佳方法是什么。在过去的几天里,我一直在搜寻很多东西,并且遇到过几种策略,考虑到React的这一功能正在“推广”多少,这些策略似乎都不是一件好事。
我认为,最简单的方法是在实际渲染开始之前填充所有商店。这意味着组件层次结构之外的某个地方(例如,钩到了我的路由器)。这种方法的问题在于,我几乎必须两次定义页面结构。考虑一个更复杂的页面,例如具有许多不同组件的博客页面(实际博客文章,评论,相关文章,最新文章,Twitter流...)。我将不得不使用React组件设计页面结构,然后我必须在其他地方定义填充此当前页面的每个所需商店的过程。这对我来说似乎不是一个很好的解决方案。不幸的是,大多数同构教程都是以此方式设计的(例如, flow-tutorial)。
反应-异步。这种方法是完美的。它使我可以简单地在每个组件的特殊功能中定义如何初始化状态(无论是同步还是异步),这些功能在将层次结构呈现给HTML时被调用。它的工作方式是直到状态完全初始化后才呈现组件。问题是它需要纤维据我了解,这是一个Node.js扩展,可更改标准JavaScript行为。尽管我非常喜欢结果,但在我看来,我们没有找到解决方案,而是更改了游戏规则。而且我认为我们不应被迫使用React.js的这一核心功能。我也不确定该解决方案的一般支持。是否可以在标准Node.js虚拟主机上使用Fiber?
我自己想了一下。我还没有真正考虑过实现细节,但是总体思路是,我将以类似于React-async的方式扩展组件,然后在根组件上重复调用React.renderComponentToString()。在每次通过期间,我将收集扩展的回调,然后在和处调用它们,以填充商店。我将重复此步骤,直到将填充当前组件层次结构所需的所有商店。有很多事情需要解决,我尤其不确定性能。
我错过了什么?还有其他方法/解决方案吗?现在,我正在考虑采用react-async / fibers方式,但是我不确定,正如第二点所述。
GitHub上的相关讨论。显然,没有官方的方法甚至解决方案。可能真正的问题是应如何使用React组件。像简单的视图层(几乎是我的建议之一)还是真正的独立组件?