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