Redux-Middleware 中间件原理分析

Redux 是一个极为流行的状态管理工具,它被广泛应用于 React 应用中。Redux 的核心概念是 Store,但是如果把所有的逻辑都写在 Store 中会使得代码变得复杂且难以维护。因此,Redux 提供了 Middleware 的概念来弥补这一缺陷。本文将深入分析 Redux-Middleware 中间件的原理和用法。

Redux-Middleware 是什么?

在 Redux 中, 中间件就是介于 Action 和 Reducer 之间的一个处理过程。Redux-Middleware 是一种被广泛使用的 Redux 中间件,它提供了一个统一的、可插拔的机制来扩展 Redux 基于应用。它可以用于检测非法 Action、异步行为(例如跨域请求)等没有被 Reducer 所处理的行为。

Redux-Middleware 的处理流程如下:

  1. 根据中间件定义的条件过滤 Action;

  2. 对 Action 进行某种处理,例如记录日志、转化 Action 或切片 Payload;

  3. (可选)内部发起异步操作;

  4. (可选)异步操作执行完毕后,继续将 Action 传递到下一个 Middleware 或 dispatch 到 Reducer。

Redux-Middleware 的使用方法

使用 Redux-Middleware 需要遵循以下步骤:

  1. 引入 Redux-Middleware 库和相应的中间件;

  2. 在 Store 的创建过程中使用 applyMiddleware 来注入 Middleware。

示例代码如下:

------ - ------------ --------------- - ---- --------
------ ------ ---- ---------------
------ ----- ---- --------------
------ ----------- ---- -------------

----- ---------- - ------- --------
----- ----- - ------------
   ------------
   ------------------------------
--

这段代码导入了两种常见的 Middleware —— logger 和 thunk ,并将它们作为参数传递给 applyMiddleware 函数。applyMiddleware 函数接收所有要使用的 Middleware 数组,并创建一个新的 Store。

在创建 Middleware 之前,我们需要安装对应的库。logger 和 thunk 均受到广泛支持,可以通过 npm 安装:

--- ------- ------------ ----------- ------

其中,logger 用于在控制台上记录 Action 和状态变化,从而方便调试;thunk 用于处理 Redux 异步流程。每个 Middleware 都必须从上一个 Middleware 接收一个 Action 并返回一个 Action。你也可以在 Middleware 内部发起自定义的异步操作,通过 Promise 来异步完成并返回结果,然后通过 dispatch 来派发 Action 到下一个 Middleware 或 Reducer。

Middleware 的原理分析

了解了 Redux-Middleware 的使用方法之后,下面我们将深入分析它的原理。

Redux-Middleware 依赖于 Function 的柯里化来实现对函数的预处理。具体而言,Reducer 是对 Store 中应用程序状态更改的具体控制,中间件传递的是原始的 dispatch。因此,Middleware 本质上是对柯里化函数的操作,例如 redux-thunk 库中的 applyMiddleWare 的代码如下:

-------- ------------------------------- -
  ------ ----------- -- --------- -- -
    ----- ----- - ---------------------
    --- -------- - -- -- -
      ----- --- ------
         ------------ ----- ------------ ---- ---------- -- --- ---------
      --
    --

    ----- ------------- - -
      --------- ---------------
      --------- --------- -- ------------------
    --
    ----- ----- - -------------------------- -- ---------------------------
    -------- - ----------------------------------

    ------ -
      ---------
      ---------
    --
  --
-

applyMiddleware 函数通过接收一个或多个中间件函数的数组来生成一个新的函数,并返回一个被装饰后的 createStore 函数。

首先,applyMiddleware 接收 createStore 函数,并返回一个新的函数。当这个函数被调用时,调用链上所有中间件的实例将被创建。每个中间件实例应该将其 API 暴露给下一个中间件,同时将其自己作为 dispatch 的行为附加到这个 API 上。由于中间件实例彼此独立,所以每个中间件都可用来修改整个调用链。最后,applyMiddleware 在 dispatch 上创建一个组合所创建的调用链提供给整个应用程序。

下面我们来具体分析一下 applyMiddleware 的实现逻辑:

  1. 使用 createStore 函数创建 store;

  2. 允许 中间件 访问 getState 和 dispatch API;

  3. 遍历包含传入的每个 Middleware 的中间件数组,并调用每个中间件函数。每个中间件函数接收 Middleware API 作为参数,并返回一个新函数,此新函数接收参数 next。此新函数的 return(在我们的例子中,即 p1)被设置为下一个函数(这个函数是下一个 Middleware 的新函数或是 Real Dispatch)。参数“next”只是对下一个函数的引用,如果“next”调用了一个参数并返回结果,那么这个 Middleware 函数将拿到返回的结果。如果“next”调用时未附带参数,一个由下一个 Middleware 提供的普通的 dispatch 方法会被传递过来。

  4. 最后,将所有中间件连接起来形成一个链。在现有调用链的顶部添加一个新函数,这个函数将调用连接的函数,即 reducer 的实现。这个函数被提供给创建 store 的过程,并作为一个新的 dispatch 版本。dispatch 版本将作为整个程序的入口,并触发调用链中的每一个中间件函数。总的执行顺序是由 Middleware 生成链的顺序决定的。

结论

Redux-Middleware 是 Redux 中极其重要的特性之一,它可以非常方便地对各种 Action 序列进行处理。在本文中,我们讲解了 Redux-Middleware 的基本用法,并深入分析了它的实现原理。希望读者能够通过本文了解 Redux-Middleware,进一步加深对 Redux 的理解,提高自己的应用程序开发能力。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/670b787cd91dce0dc88acee4