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

Posted

技术标签:

【中文标题】在服务器和客户端上使用 Redux【英文标题】:Using Redux on the Server and on the Client 【发布时间】:2016-10-04 18:29:24 【问题描述】:

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

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

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


    user: 'mike@aol.com',
    room: 
       name: 'sports',
       users: [ ... ],
       messages: [ ... ]
    

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


    connectedUsers: ['mike@aol.com', ... ],
    rooms: [
      
          name: 'sports',
          users: [ ... ],
          messages: [ ... ]
      ,
       ... ,
       ... 
    ]

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

我的问题

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

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

【问题讨论】:

【参考方案1】:

这可能有点晚了,但无论如何。 我做了一个实验,我正在实现一个多浏览器多人井字游戏。 Redux 是后端的主要状态分发器。

该实验以一系列文章的形式结束,其中以非常详细的方式描述了在后端使用 Redux 的方式和原因,与您更喜欢在前端使用 Redux 还是经典的 React 状态无关。

    Server-side Redux. Part I. The Redux. Server-side Redux. Part II. The Design. Server-side Redux. Part III. The Code.

如果您有任何问题,请随时给我留言。

【讨论】:

【参考方案2】:

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

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

【讨论】:

我知道这已经很老了,但是如果它在 aws lambda 或 google cloud 函数上运行,你怎么看?

以上是关于在服务器和客户端上使用 Redux的主要内容,如果未能解决你的问题,请参考以下文章

WebSocket 服务器中的 Redux

node.js 中的多人游戏架构 - 与 Redux 的状态管理和同步

CORS 预检错误 redux & loopback API

使用 redux 和 react 进行异步服务器端渲染

在同构 Redux 应用程序中在哪里设置 cookie?

Next.js s-s-r 存储访问令牌而不使用 redux