React JS 同构渲染

React JS isomorphic render

ReactJS,原始 Flux,react-router,nodeJS,socket.io 一切都是最新的。

如果我在浏览器中关闭 javascript,则只会呈现静态代码。

在服务器端呈现 ComponentWillMountrender 方法期间,但没有 ComponentDidMount
即使我将 Flux 逻辑放入 ComponentWillMount 方法中,也没有任何反应:调用操作,但 socket.io 不会向服务器发送请求以从数据库中获取数据。这意味着,不会从数据库中检索任何数据,也不会呈现任何对搜索引擎有用的数据。 如果启用 javascript,一切都会完美。

这里是重要的代码片段:

组件。添加侦听器并调用操作:

componentDidMount() {
    StoreUser.addChangeListener(this._onChange);
    Actions.getUser(this.props.params.userid)   
}

客户端的操作要求服务器提供用户数据:

function _getUser (userid) {
  socket.emit('getUser', userid)
}

直到这个地方服务器端渲染工作,但服务器本身没有收到 getUser 事件,所以没有进一步发生。 同样,如果在浏览器中启用 javascript,所有这些都可以正常工作。服务器收到此调用和 returns 用户的数据。

我如何让服务器接收这个事件,return 用户的数据并在发送给客户端之前渲染它? 作为替代方案,是否有其他方法可以使其对 SEO 友好?

React 的 componentDidMount 生命周期钩子没有在服务端调用,as stated in the docs.

如果您需要在组件的 render 方法中获取数据并在服务器端使用它,您需要在初始渲染期间将此数据作为 props 传递。这意味着,您无法在 componentWillMount 期间获取它,即使调用了挂钩。

要实现你想要的,你需要你的服务器端代码:

  • 确定要渲染的组件
  • 派遣适当的行动,以便您的商店得到适当的填充
  • 仅在那时渲染您的组件 - 因为数据可用于在初始渲染中传递给您的组件

如何实现的细节当然取决于您的 flux 实现、您在服务器端使用的框架等。