React16基础知识第二版教程:第十二章Redux简化架构消除专用调度程序需求
接触Redux有一段时间的开发者,应该都见过早期Redux架构里那个专门的调度程序模块。很多人刚学的时候都会犯嘀咕,为什么要单独拆出这么一层,写起代码来绕来绕去,反而把简单的状态更新变复杂了。
其实在React16的生态迭代里,Redux本身也在跟着做架构简化,最早那个需要手动维护的专用调度程序,慢慢就变成了不需要单独存在的模块。今天咱们就顺着这个点,把整个变化理清楚,顺便说说简化之后对日常开发有什么影响。
先给刚入门的朋友补个背景,早期Redux为什么会搞出专用调度程序?最开始Redux设计的时候,为了保证单一数据源和纯函数更新的核心原则,把状态更新的流程拆得很细。用户触发action之后,先到调度程序里做排队、中间件处理,最后才给到reducer生成新状态。
那时候很多第三方中间件,比如处理异步的thunk或者saga,都需要挂载在调度程序这一层做拓展。所以很长一段时间里,大家写Redux代码都得先初始化store,再配置调度程序,再挂载中间件,光初始化就要写十几行代码,新手看了直接头大。
后来React16推出来了,整个React的更新机制都变了,Fiber架构让更新可以分片中断,也改变了大家对状态调度的认知。同时越来越多开发者反馈,Redux的入门门槛太高,很多简单项目根本不需要那么复杂的分层,专用调度程序反而变成了冗余的架构包袱。
举个很常见的例子,你做一个简单的个人博客页面,只有用户信息、文章列表两个需要全局共享的状态。按照旧架构来写,你得建action、建reducer、单独配置调度程序,还要写一堆绑定代码,最后实际用到的状态更新逻辑其实没几行,大半代码都是在给架构买单。
这种冗余不仅让开发变慢,后期维护的时候,新人接手光理清楚调度层和action层的关系就要花半天,改个小需求都要翻好几个文件。所以Redux团队才开始推架构简化,核心就是要干掉这种没必要的专用调度层,把流程合并得更简单。
那具体是怎么简化的?其实核心思路就是把原来调度程序负责的工作,直接合并到store本身里了。现在我们用最新的Redux Toolkit写代码的时候,根本不需要单独声明调度程序,configureStore这个方法会自动帮你把所有需要的配置都处理好,包括中间件的挂载、调度逻辑的整合。
你想要触发状态更新,直接调用store.dispatch就可以,不需要再把action转发给单独的调度程序。原来分开的store实例和调度程序,现在直接捏合成了一个整体,你不用再记那么多分层规则,上手难度直接降了一半。
可能有人会担心,把调度程序合并进去,原来的异步处理、中间件拓展会不会用不了?其实完全不会,原来调度程序能做的事情,现在整合进去之后照样能做。你想用thunk处理异步,还是想用saga做复杂副作用,只需要在configureStore的时候把中间件配进去就行,不需要再和调度程序做绑定,代码反而更干净。
我自己换了新写法之后最大的感受,就是项目里的文件数量少了很多。原来要单独加一个调度程序的配置文件,现在根本不需要,所有配置都在store初始化那几十行里写完了。找bug的时候也不用跨好几个文件跳来跳去,直接看store配置和reducer就能定位问题。
还有一个很多人没注意到的变化,就是简化之后和React16的兼容更好了。React16的错误边界、并发更新这些新特性,对状态更新的时序要求更高,原来单独的调度程序很容易和React的更新时序冲突,有时候会出现更新不触发或者重复触发的问题。现在合并之后,Redux的更新调度和React的更新流程配合得更顺畅,这种奇怪的bug少了很多。
当然也有老开发者会不习惯,说原来的分层更清晰,符合Redux一开始设计的三原则。其实你仔细想,Redux的核心原则是单一数据源、纯函数reducer、不可变状态,这三点架构简化之后一点都没动,只是把冗余的分层去掉了,核心原则根本没丢。
原来那个专用调度程序,本质上就是为了兼容早期的拓展需求做的拆分,现在拓展方式已经统一整合到store里了,自然就没有必要单独留这么一层。就像你出门买东西,原来需要带钱包、手机、钥匙三个分开的袋子,现在把所有东西都放进一个双肩包,不是丢了东西,只是装的方式更方便了,用的时候拿出来一样能用。
对新手来说,这个简化最大的好处就是入门更快了。我带过几个刚学React的新人,原来学Redux的时候,光理解action、reducer、调度程序、store这几个分层的关系就要花一周,现在用Redux Toolkit,半天就能跑通一个简单的全局状态项目,剩下的时间可以直接去学业务逻辑,不用在架构概念上绕圈子。
如果你的项目现在还是用旧的写法,保留了单独的专用调度程序,其实也不用急着重构。如果项目已经稳定运行,重构反而会引入不必要的风险。但如果是新开的项目,真的建议你试试简化后的架构,不用再手动写调度程序的配置,省下来的时间可以多写几个业务功能。
总的来说,Redux这次架构简化,就是跟着社区的实际使用需求做的调整。从最开始追求架构设计的完美分层,到现在追求开发效率和易用性,干掉专用调度程序就是这种变化最直观的体现,对整个React生态的普及来说,确实是一件好事。
React16, Redux, Redux架构简化, 专用调度程序, Redux基础知识, Redux Toolkit, configureStore, 状态更新, Redux入门, React状态管理
[Q]:早期Redux为什么需要专用调度程序?
[A]:早期Redux为了保证核心设计原则,将状态更新流程拆分细化,第三方中间件需要挂载在调度层拓展,因此单独拆分出了专用调度程序模块。
[Q]:Redux为什么要简化架构消除专用调度程序?
[A]:专用调度程序会增加不必要的代码量和入门门槛,冗余分层让开发维护成本变高,也容易和React16的更新机制产生冲突,因此Redux选择简化架构合并这一模块。
[Q]:消除专用调度程序后,Redux的核心原则会被改变吗?
[A]:不会,Redux的单一数据源、纯函数reducer、不可变状态这三个核心原则没有任何改动,只是移除了冗余的分层结构,使用更方便。
[Q]:简化架构后原来的中间件还能正常使用吗?
[A]:完全可以正常使用,原来调度程序负责的功能已经整合进store本身,只需要在初始化store的时候配置好对应中间件即可,不需要额外绑定调度程序。
[Q]:Redux简化架构后,开发体验有什么提升?
[A]:代码量和项目文件数量减少,初始化配置更简单,调试定位bug更方便,也能更好兼容React16的Fiber架构和更新机制,减少奇怪的时序bug。
[Q]:现在写Redux还需要手动配置调度程序吗?
[A]:使用最新的Redux Toolkit不需要,configureStore方法会自动整合调度逻辑和中间件配置,直接调用store.dispatch触发更新即可。
[Q]:旧项目的专用调度程序需要立即重构吗?
[A]:不需要,如果旧项目已经稳定运行,重构反而会引入不必要的风险,保持原有写法即可,新项目直接用简化架构即可。
[Q]:架构简化对Redux新手有什么好处?
[A]:降低了入门门槛,新手不需要花大量时间理解多层架构的关系,更快就能跑通可运行的项目,把更多时间放在业务逻辑学习上。
其实在React16的生态迭代里,Redux本身也在跟着做架构简化,最早那个需要手动维护的专用调度程序,慢慢就变成了不需要单独存在的模块。今天咱们就顺着这个点,把整个变化理清楚,顺便说说简化之后对日常开发有什么影响。
先给刚入门的朋友补个背景,早期Redux为什么会搞出专用调度程序?最开始Redux设计的时候,为了保证单一数据源和纯函数更新的核心原则,把状态更新的流程拆得很细。用户触发action之后,先到调度程序里做排队、中间件处理,最后才给到reducer生成新状态。
那时候很多第三方中间件,比如处理异步的thunk或者saga,都需要挂载在调度程序这一层做拓展。所以很长一段时间里,大家写Redux代码都得先初始化store,再配置调度程序,再挂载中间件,光初始化就要写十几行代码,新手看了直接头大。
后来React16推出来了,整个React的更新机制都变了,Fiber架构让更新可以分片中断,也改变了大家对状态调度的认知。同时越来越多开发者反馈,Redux的入门门槛太高,很多简单项目根本不需要那么复杂的分层,专用调度程序反而变成了冗余的架构包袱。
举个很常见的例子,你做一个简单的个人博客页面,只有用户信息、文章列表两个需要全局共享的状态。按照旧架构来写,你得建action、建reducer、单独配置调度程序,还要写一堆绑定代码,最后实际用到的状态更新逻辑其实没几行,大半代码都是在给架构买单。
这种冗余不仅让开发变慢,后期维护的时候,新人接手光理清楚调度层和action层的关系就要花半天,改个小需求都要翻好几个文件。所以Redux团队才开始推架构简化,核心就是要干掉这种没必要的专用调度层,把流程合并得更简单。
那具体是怎么简化的?其实核心思路就是把原来调度程序负责的工作,直接合并到store本身里了。现在我们用最新的Redux Toolkit写代码的时候,根本不需要单独声明调度程序,configureStore这个方法会自动帮你把所有需要的配置都处理好,包括中间件的挂载、调度逻辑的整合。
你想要触发状态更新,直接调用store.dispatch就可以,不需要再把action转发给单独的调度程序。原来分开的store实例和调度程序,现在直接捏合成了一个整体,你不用再记那么多分层规则,上手难度直接降了一半。
可能有人会担心,把调度程序合并进去,原来的异步处理、中间件拓展会不会用不了?其实完全不会,原来调度程序能做的事情,现在整合进去之后照样能做。你想用thunk处理异步,还是想用saga做复杂副作用,只需要在configureStore的时候把中间件配进去就行,不需要再和调度程序做绑定,代码反而更干净。
我自己换了新写法之后最大的感受,就是项目里的文件数量少了很多。原来要单独加一个调度程序的配置文件,现在根本不需要,所有配置都在store初始化那几十行里写完了。找bug的时候也不用跨好几个文件跳来跳去,直接看store配置和reducer就能定位问题。
还有一个很多人没注意到的变化,就是简化之后和React16的兼容更好了。React16的错误边界、并发更新这些新特性,对状态更新的时序要求更高,原来单独的调度程序很容易和React的更新时序冲突,有时候会出现更新不触发或者重复触发的问题。现在合并之后,Redux的更新调度和React的更新流程配合得更顺畅,这种奇怪的bug少了很多。
当然也有老开发者会不习惯,说原来的分层更清晰,符合Redux一开始设计的三原则。其实你仔细想,Redux的核心原则是单一数据源、纯函数reducer、不可变状态,这三点架构简化之后一点都没动,只是把冗余的分层去掉了,核心原则根本没丢。
原来那个专用调度程序,本质上就是为了兼容早期的拓展需求做的拆分,现在拓展方式已经统一整合到store里了,自然就没有必要单独留这么一层。就像你出门买东西,原来需要带钱包、手机、钥匙三个分开的袋子,现在把所有东西都放进一个双肩包,不是丢了东西,只是装的方式更方便了,用的时候拿出来一样能用。
对新手来说,这个简化最大的好处就是入门更快了。我带过几个刚学React的新人,原来学Redux的时候,光理解action、reducer、调度程序、store这几个分层的关系就要花一周,现在用Redux Toolkit,半天就能跑通一个简单的全局状态项目,剩下的时间可以直接去学业务逻辑,不用在架构概念上绕圈子。
如果你的项目现在还是用旧的写法,保留了单独的专用调度程序,其实也不用急着重构。如果项目已经稳定运行,重构反而会引入不必要的风险。但如果是新开的项目,真的建议你试试简化后的架构,不用再手动写调度程序的配置,省下来的时间可以多写几个业务功能。
总的来说,Redux这次架构简化,就是跟着社区的实际使用需求做的调整。从最开始追求架构设计的完美分层,到现在追求开发效率和易用性,干掉专用调度程序就是这种变化最直观的体现,对整个React生态的普及来说,确实是一件好事。
React16, Redux, Redux架构简化, 专用调度程序, Redux基础知识, Redux Toolkit, configureStore, 状态更新, Redux入门, React状态管理
[Q]:早期Redux为什么需要专用调度程序?
[A]:早期Redux为了保证核心设计原则,将状态更新流程拆分细化,第三方中间件需要挂载在调度层拓展,因此单独拆分出了专用调度程序模块。
[Q]:Redux为什么要简化架构消除专用调度程序?
[A]:专用调度程序会增加不必要的代码量和入门门槛,冗余分层让开发维护成本变高,也容易和React16的更新机制产生冲突,因此Redux选择简化架构合并这一模块。
[Q]:消除专用调度程序后,Redux的核心原则会被改变吗?
[A]:不会,Redux的单一数据源、纯函数reducer、不可变状态这三个核心原则没有任何改动,只是移除了冗余的分层结构,使用更方便。
[Q]:简化架构后原来的中间件还能正常使用吗?
[A]:完全可以正常使用,原来调度程序负责的功能已经整合进store本身,只需要在初始化store的时候配置好对应中间件即可,不需要额外绑定调度程序。
[Q]:Redux简化架构后,开发体验有什么提升?
[A]:代码量和项目文件数量减少,初始化配置更简单,调试定位bug更方便,也能更好兼容React16的Fiber架构和更新机制,减少奇怪的时序bug。
[Q]:现在写Redux还需要手动配置调度程序吗?
[A]:使用最新的Redux Toolkit不需要,configureStore方法会自动整合调度逻辑和中间件配置,直接调用store.dispatch触发更新即可。
[Q]:旧项目的专用调度程序需要立即重构吗?
[A]:不需要,如果旧项目已经稳定运行,重构反而会引入不必要的风险,保持原有写法即可,新项目直接用简化架构即可。
[Q]:架构简化对Redux新手有什么好处?
[A]:降低了入门门槛,新手不需要花大量时间理解多层架构的关系,更快就能跑通可运行的项目,把更多时间放在业务逻辑学习上。
评论 (0)
