Redux中的动态中间件

时间:2015-11-08 02:41:40

标签: redux

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

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

3 个答案:

答案 0 :(得分:7)

中间件不是一些单独的扩展,它是您的商店 的一部分。在运行时交换它可能会导致不一致。如果您不知道他们将要运行哪些中间件,您如何推理自己的行为? (请记住,中间件不必同步操作。)

你可以尝试如下的天真实现:

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

但请注意中间件合同,尤其是next参数。每个中间件都会收到"传递给下一个中间件" 功能,作为其构建的一部分。即使您动态应用中间件,您仍然需要告诉他们如何将结果传递给下一个中间件。现在您面临亏损选择:

  1. 操作将通过调度时注册的所有中间件(如上所示),即使它已被删除或同时添加了其他中间件,或
  2. 每次传递动作时,它都会转到下一个当前注册的中间件(实现是一个微不足道的练习),因此一个动作可以通过一组从未在一起注册的中间件来实现一个时间点。
  3. 通过坚持使用静态中间件来完全避免这些问题可能是一个好主意。

答案 1 :(得分:2)

答案 2 :(得分:-1)

尝试即时更改中间件会违反纯粹的'动作和减速器功能,因为它引入了副作用。生成的应用程序很难进行单元测试。

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