Redux中的动态中间件

Redux中的动态中间件,redux,Redux,我正在使用Redux编写一个NodeJS应用程序。我感兴趣的是允许用户通过在运行时指定中间件来动态加载中间件 如何动态更新正在运行的Redux应用程序的中间件以添加或删除中间件?中间件不是某个单独的扩展,它是存储的一部分。在运行时交换它可能会导致不一致。如果您不知道这些操作将通过什么中间件运行,您如何对其进行推理?(请记住,中间件不必同步运行。) 您可以尝试以下简单的实现: const middlewares = []; const middlewareMiddleware = store =&

我正在使用Redux编写一个NodeJS应用程序。我感兴趣的是允许用户通过在运行时指定中间件来动态加载中间件


如何动态更新正在运行的Redux应用程序的中间件以添加或删除中间件?

中间件不是某个单独的扩展,它是存储的一部分。在运行时交换它可能会导致不一致。如果您不知道这些操作将通过什么中间件运行,您如何对其进行推理?(请记住,中间件不必同步运行。)

您可以尝试以下简单的实现:

const middlewares = [];
const middlewareMiddleware = store => next => act => {
  const nextMiddleware = remaining => action => remaining.length
    ? remaining[0](store)(nextMiddleware(remaining.slice(1)))(action)
    : next(action);
  nextMiddleware(middlewares)(act);
};
// ... now add/remove middlewares to/from the array at runtime as you wish
但是请注意中间件契约,特别是
下一个
参数。作为构建的一部分,每个中间件都会收到一个“传递到下一个中间件”功能。即使动态应用中间件,也需要告诉他们如何将结果传递给下一个中间件。现在您面临着一个选择:

  • 操作将遍历在其被调度时注册的所有中间件(如上所示),即使它被删除或同时添加了其他中间件,或者
  • 每次传递操作时,它都会转到当前注册的下一个中间件(实现是一个简单的练习),因此操作可能会经过从未在单个时间点注册在一起的中间件组合

  • 通过坚持使用静态中间件来避免这些问题可能是一个好主意。

    尝试动态更改中间件将违反“纯”操作和缩减器功能的原则,因为这会带来副作用。由此产生的应用程序将很难进行单元测试


    在我的脑海中,可能会创建多个存储(每个可能的中间件配置一个存储),并使用父存储在它们之间提供状态切换。切换时,您将在子存储之间移动数据。警告:我还没有看到这样做,可能有很好的理由不这样做。

    使用
    redux动态中间件


    您希望如何控制哪些中间件处于活动状态?我开始研究一个PoC,该PoC的状态为
    中间件
    阵列,它将通过提供的中间件依次运行操作。为了回答你的问题,我宁愿使用最佳实践,不管是什么。我认为没有最佳实践。不清楚为什么要在运行时动态加载不同的中间件。您是否试图区分开发构建和生产构建?当应用程序在生产环境中运行时,您是否希望打开或关闭中间件?在这种情况下,我想会有一些背景。基本上,你创建了一个中间产品“烘焙”的商店,所以我认为没有好的方法。听起来你要做一些非常奇怪的事情,所以可能需要更多的上下文?顺便说一句,您可以使用您的商店状态来区分中间件行为,也许这会有所帮助?我意识到这是架构的延伸;这是一个桌面应用程序(Electron),允许用户下载和安装插件。我希望能够立即启用插件(从磁盘加载并开始处理操作)无需用户重新启动应用程序。多个应用程序商店也违反了redux原则。
    如果单元测试与应用程序上下文隔离测试代码单元,则生成的应用程序将很难进行单元测试
    。向应用程序商店添加中间件是多么困难。感谢您创建和共享此伟大的软件包!