在服务器和客户端上使用 Redux

Tab*_*dah 5 universal-code node.js express socket.io redux

最近,我一直在使用两个 redux 存储构建通用 Web 应用程序:一个在客户端,一个在服务器上。Redux 似乎是管理状态数据的好工具。可以将 Redux 用于 React 之外的东西吗?例如,您可以在命令行应用程序中使用 Redux 吗?

我觉得这种客户端存储和服务器存储方法打破了“单一事实来源规则”,但感觉很好,到目前为止效果很好。我发现我可以重用大约 80% 的 reducer 来组成两个 store。服务器上的状态通常是一个集合,其中客户端上的状态可以是单个对象。

例如:假设您有一个聊天应用程序的客户端状态

{
    user: 'mike@aol.com',
    room: {
       name: 'sports',
       users: [ ... ],
       messages: [ ... ]
    }
}
Run Code Online (Sandbox Code Playgroud)

服务器的状态是类似的,可以使用类似的减速机,但它使用的集合,而不是对象。

{
    connectedUsers: ['mike@aol.com', ... ],
    rooms: [
      {
          name: 'sports',
          users: [ ... ],
          messages: [ ... ]
      },
      { ... },
      { ... }
    ]
}
Run Code Online (Sandbox Code Playgroud)

创建两个状态树重用了许多相同的减速器。这种方法还允许我将动作发送到服务器并响应来自客户端的动作。当有新连接时,使用服务器存储生成状态客户端存储也不是很困难。

我的问题

我对这种通用应用程序的方法很感兴趣。这是否违反任何规则?您可以拥有一个客户端商店和一个服务器商店吗?使用服务器存储生成初始值并不难。

还有其他人以这种方式使用通用应用程序吗?

小智 0

我使用这种方法遇到的主要问题是服务器上的 redux 存储将保留在节点实例的内存中。当您投入生产并希望从单个服务器实例进行扩展时,这将是一个问题。

例如,如果您部署到 Heroku,当您增加 dyno 的数量时,您也会增加节点进程的数量。每个节点进程都有自己的 redux 状态副本。因此,您的客户端可能会在第一个请求时获得一个进程,并在下一个请求时获得具有不同数据的不同进程。