React.js最大的优点之一应该是 服务器端渲染服务器端渲染。问题是关键函数 React.renderComponentToString()
是同步的,这使得在服务器上呈现组件层次结构时不可能加载任何异步数据。
假设我有一个通用的评论组件,我可以把它放在页面的任何地方。它只有一个属性,某种标识符(例如,一篇文章的 id,注释放在其下) ,其他所有事情都由组件本身处理(加载、添加、管理注释)。
我非常喜欢 变化架构,因为它使很多事情变得更容易,而且它的 商店非常适合在服务器和客户端之间共享状态。一旦我的包含注释的存储被初始化,我可以只序列化它,并将它从服务器发送到客户机,在那里它很容易恢复。
问题是怎样才能最好地填充我的商店。在过去的日子里,我一直在谷歌搜索很多,我遇到了几个策略,没有一个看起来真的很好,考虑到多少这个功能的反应是“促进”。
在我看来,最简单的方法是在实际呈现开始之前填充我的所有存储。这意味着在组件层次结构之外的某个地方(例如连接到我的路由器)。这种方法的问题在于,我必须两次定义页面结构。考虑一个更复杂的页面,例如一个包含许多不同组件的博客页面(实际的博客帖子、评论、相关帖子、最新帖子、 twitter 流...)。我必须使用 React 组件设计页面结构,然后在其他地方定义填充当前页面所需的每个存储的过程。我觉得这不是个好办法。不幸的是,大多数同构教程都是这样设计的(例如这个很棒的 通量教程)。
反应-异步。这个方法很完美。它允许我在每个组件中的一个特殊函数中定义如何初始化状态(无论是同步还是异步) ,并且当层次结构呈现为 HTML 时调用这些函数。它的工作方式是在完全初始化状态之前不呈现组件。问题是它需要 Fibers,据我所知,Fibers是一个 Node.js 扩展,可以改变标准的 JavaScript 行为。虽然我真的很喜欢这个结果,但在我看来,我们并没有找到解决方案,而是改变了游戏规则。我认为我们不应该被迫使用 React.js 的这个核心特性。我也不确定这个解决方案是否得到普遍支持。是否可以在标准的 Node.js 主机上使用光纤?
I was thinking a little on my own. I haven't really thought trough the implementation details but the general idea is that I would extend the components in similar way to React-async and then I would repeatedly call React.renderComponentToString() on the root component. During each pass I would collect the extending callbacks and then call them at the and of the pass to populate the stores. I would repeat this step until all stores required by current component hierarchy would be populated. There are many things to be solved and I'm particularly unsure about the performance.
我错过什么了吗?是否有其他方法/解决办法?现在,我正在考虑采用异步反应/纤维反应的方式,但是我不能完全确定是否如第二点所解释的那样。
GitHub 相关讨论。显然,目前还没有正式的方法,甚至没有解决方案。也许真正的问题是如何使用反应组件。喜欢简单的视图层(基本上我的建议第一)或喜欢真正的独立和独立的组件?