Redux 源码阅读笔记——applyMiddleware

Redux 是一种强有力的状态管理器,可以为中大型应用程序提供可预测的状态管理机制。Redux 的核心代码非常小巧,也非常明晰,但是其实现过程可以比较复杂。

其中,Redux 的 applyMiddleware 函数可以为应用程序提供中间件机制,使得开发者可以方便地插入非常灵活的扩展逻辑。本文将深入探讨 applyMiddleware 的源码实现细节,帮助读者深刻理解 Redux 中间件机制的工作原理。

概述

在 Redux 中,store 接受单一的 reducer 函数,并使用 dispatch 函数将 action 解析为新的 state。applyMiddleware 函数则具有将插件插入 Redux 流程的能力,修改 store.dispatch 函数以允许插件干预状态管理流程。大多数插件会修改或增强 action 对象,或者修改或增强 state 对象。某些插件可能会完全替换 store.dispatch 和 store.getState 函数。applyMiddleware 使得开发者可以从外面很容易地调整 Redux 的行为,而无需修改 Redux 核心代码。

源码细节

applyMiddleware 函数非常简单:

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

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

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

我们来认真解读这段代码:

  1. applyMiddleware 函数接受任意数量的中间件函数,并返回一个函数。
  2. 返回的函数接受 createStore 函数作为参数,并返回另一个函数。
  3. createStore 函数接受 reducer 函数和默认状态值作为参数,并返回一个拥有 getState、dispatch、subscribe、replaceReducer 属性的对象——即 Redux 中的 store。
  4. 返回的函数接受 reducer 函数和默认状态值作为参数,并通过 createStore 函数创建一个 store 对象。
  5. applyMiddleware 函数定义了一个初始的 dispatch 函数,它将在后面被重写,以便插件能够修改它。
  6. 定义 middlewareAPI 对象作为中间件函数的基础 API。其中,getState 函数是 Redux 内部的 getState 函数,而 dispatch 函数是初步定义的 dispatch 函数,其中参数被转发至导致其调用的函数中。
  7. 将中间件函数应用于 middlewareAPI 对象,并创建中间件链。此操作使用 map 函数转换每个中间件,使其接受 middlewareAPI 对象作为参数,并通过调用它们(在 action 发生之前)返回一个新的 dispatch(action) 函数。
  8. 将新的 dispatch 函数与 createStore 函数返回的原始 dispatch 函数与 composed 中间件链合并。此合成函数具有类似于洋葱模型的行为——它将最内层的中间件包装住,接着包装在中层的,再接着包装外层的中间件。最终,store.dispatch 包装了所有的中间件。
  9. 返回包含 store 和新的 dispatch 函数的对象。经过中间件链的处理,现在我们已经准备好向 Redux 分发 action。

通常,Redux 插件的代码看起来像这样:

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

这基本上是一个返回中间件的函数,该中间件接受包含底层 store 的对象,以及一个带有将 action 传递给下一个中间件的 next 函数。它也需要传递 action 给下一个中间件,并返回下一个调用到底层 store 的 next 方法的结果,以确保 next 能够异步地处理每个操作。

实践指南

使用 applyMiddleware 作为扩展 Redux 应用程序的一种可能方法。

首先,Redux 提供了一个非常有用的 logger 插件。通过调用 npm install --save-dev redux-logger 安装它:

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

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

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

请注意,你可以通过简单的调用 applyMiddleware 函数来插入多个中间件。只需将它们作为一个数组传递给 applyMiddleware 函数即可。例如,如果你希望在应用程序中同时使用 redux-thunk 和 redux-logger,可以按照以下方式加载它们:

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

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

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

这个应用程序将可以异步地处理 action,同时将详细的操作日志记录到浏览器的开发者工具控制台中。

总结

Redux 的 applyMiddleware 函数为开发人员提供了灵活性和可扩展性,可以消除一些样板式代码,并让应用程序拥有更好的标准化和更强的可预测性。通过本文,你已经了解到 applyMiddleware 的实现细节,并学会了如何选择和使用 Redux 插件,以便实现增强的应用程序功能。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64c5ef4c95c405902ee41985


猜你喜欢

  • CSS Grid 学习笔记:如何增强层叠样式表中的响应式布局

    前言 对于前端开发者来说,响应式布局是一项必备技能。在过去,我们往往使用媒体查询和流式布局来实现响应式设计。然而,这些方法往往过于繁琐,而且在处理复杂的布局时很难把控效果。

    1 年前
  • 在 Angular 应用中更好地使用 TypeScript

    在 Angular 应用中更好地使用 TypeScript Angular 是一款流行的前端框架, TypeScript 是一种强类型的 JavaScript 超集。

    1 年前
  • Babel 中如何处理不同类型的数据解构

    Babel 是一个流行的 JavaScript 编译器,它可以将新版本的 JavaScript 代码转换成能够在旧版本浏览器中运行的代码。Babel 可以处理各种不同类型的数据解构,包括 ECMASc...

    1 年前
  • Vue SPA 应用中使用 Keep-alive 优化缓存问题

    前言 在开发 Vue 单页应用过程中,我们经常需要处理路由的缓存问题。在路由跳转时保存一些页面状态,以便用户在回退或者前进时可以快速展示对应的缓存页面。 Vue 提供了 Keep-alive 组件,可...

    1 年前
  • # Redux 集成 Immutable.js 的实践

    Redux 集成 Immutable.js 的实践 背景 前端开发中,随着应用复杂度的提升,数据状态管理变得越来越重要,Redux 作为一种流行的状态管理框架被广泛使用。

    1 年前
  • 解决 RESTful API 返回数据不规范造成的解析问题

    作为前端开发者,我们经常需要与 RESTful API 打交道。然而,有时候从 API 中获得的数据格式并不总是符合我们的期望。这时就需要我们额外注意,并进行解析。

    1 年前
  • Flutter 性能优化实践总结

    Flutter已经成为了移动应用开发的重要技术之一,优秀的Flutter应用离不开良好的性能表现,本文对于常见的Flutter性能优化实践进行总结,提供给读者学习和指导。

    1 年前
  • 如何在 Chai 中断言一个字符串是否包含特定的子串

    如何在 Chai 中断言一个字符串是否包含特定的子串 Chai 是一个 JavaScript 的断言库,用于 JavaScript 测试框架如 Mocha 和 Jasmine 等。

    1 年前
  • Webpack + babel + es6 常见问题及解决方案

    Webpack + Babel + ES6 常见问题及解决方案 随着前端技术的快速发展,越来越多的新技术被引入到前端开发中。其中,Webpack + Babel + ES6 已成为前端开发中的热门技术...

    1 年前
  • 从 lazy load 到 react 不渲染 dom 块:ES11 中优化算法的应用

    在现代的前端开发中,页面加载速度对用户体验至关重要。因此,为了加快页面加载速度,我们需要注意一些优化算法。本文将介绍一些在 ES11 中优化算法的应用,包括从 lazy load 到 react 不渲...

    1 年前
  • 如何在 PWA 中使用 Web Push Notification?

    Web Push Notification 是一种基于浏览器的消息推送系统,它可以让网站的用户在浏览器关闭的情况下,也能够接收到站内提醒。这对于 PWA 应用来说,是一种非常实用的功能,能够提高用户的...

    1 年前
  • Serverless 框架使用小结

    在当今的互联网时代,前端技术的快速发展和 Serverless 架构的出现,使得前端开发者不再局限于传统的代码编写和服务器部署。Serverless架构已经成为一种热门趋势,它赋予开发者更高效的代码编...

    1 年前
  • ECMAScript 2019 (ES10):解决 JavaScript 中 HTML 转义的问题

    在编写前端代码的时候,我们经常需要对用户输入的内容进行转义,以防止 XSS 攻击等安全问题。在 JavaScript 中,我们通常使用 escape() 或者 encodeURI() 进行 URL 转...

    1 年前
  • Redis 性能优化方案分享

    简介 Redis 是一种高性能的缓存和键值存储数据库,常用于存储常用的数据结构和提供高可用性的缓存。在实际的项目中,如果使用不当会导致 Redis 性能不佳甚至宕机,因此了解 Redis 的性能优化方...

    1 年前
  • Fastify 中的静态文件夹解决方案

    在 Web 开发中,静态文件夹是我们经常用到的一种资源,如 HTML、CSS、JavaScript、图片等。 Fastify 是一个快速高效的 Node.js Web 框架,它提供了现成的解决方案来处...

    1 年前
  • 在 Sequelize 中如何实现数据校验和错误处理

    Sequelize 是 Node.js 中一款基于 Promise 的 ORM 框架,它提供了方便的数据库操作接口,支持多种数据库类型。但在实际应用中,由于数据的业务逻辑复杂,数据的合法性校验和错误处...

    1 年前
  • 手写 Promise.all 的实现方式

    简介 Promise.all 是 Promise 对象的一个方法,用来将多个 Promise 实例包装成一个新的 Promise 实例。它接收一个数组作为参数,数组中的每个元素都是一个 Promise...

    1 年前
  • 使用 Next.js、Firebase 和 Algolia 打造实时搜索引擎

    介绍 随着互联网的不断发展和数据量的不断增加,搜索引擎已经成为了我们生活中不可或缺的一部分。但是常规的搜索引擎搜索速度、效率和准确率都存在一些问题,同时实时搜索引擎也越来越受到开发者的关注和喜爱。

    1 年前
  • 在 Vue.js 中使用 Custom Elements 的最佳实践

    在前端开发中,使用 Custom Elements 可以将 HTML 标签封装成自定义组件,提高代码的复用性和可维护性。Vue.js 不仅内置了组件系统,还可以很好地支持 Custom Element...

    1 年前
  • Mongoose 中使用 FindByIdAndUpdate 的注意事项

    Mongoose 是一款优秀的 Node.js ORM,广泛应用于 Web 应用程序的数据库操作中。其中的 FindByIdAndUpdate 是 Mongoose 提供的一个非常常用的函数之一。

    1 年前

相关推荐

    暂无文章