网易首页 > 网易号 > 正文 申请入驻

前端领域Middleware有几种实现方式

0
分享至

前言

Middleware(中间件)本意是指位于服务器的操作系统之上,管理计算资源和网络通信的一种通用独立的系统软件服务程序。分布式应用软件借助这种软件在不同的技术之间共享资源。而在大前端领域,Middleware 的含义则简单得多,一般指提供通用独立功能的数据处理函数。典型的 Middleware 包括日志记录、数据叠加和错误处理等。本文将横向对比大前端领域内各大框架的 Middleware 使用场景和实现原理,包括Express, Koa, Redux和Axios。

大前端领域的Middleware

这里说的大前端领域自然就包括了服务器端和客户端了。最早提出 Middleware 概念的是Express, 随后由原班人马打造的Koa不但沿用了 Middleware 的架构设计,还更加彻底的把自己定义为中间件框架。

Expressive HTTP middleware framework for node.js

在客户端领域,Redux也引入了 Middleware 的概念,方便独立功能的函数对 Action 进行处理。Axios虽然没有中间件,但其拦截器的用法却跟中间件十分相似,也顺便拉进来一起比较。下面的表格横向比较了几个框架的中间件或类中间件的使用方式。

下面我们一起来拆解这些框架的内部实现方式。

Express

用法

Express的 Middleware 有多种层级的注册方式,在此以应用层级的中间件为例子。这里看到 2 个关键字,use和next。Express通过use注册,next触发下一中间件执行的方式,奠定了中间件架构的标准用法。

原理

原理部分会对源码做极端的精简,只保留核心。

Middleware 注册(use)

Middleware 调度(next)


当请求到达的时候,会触发handle方法。接着next函数从队列中顺序取出 Middleware 并执行。

Koa

用法

跟Express相比,Koa的 Middleware 注册跟路由无关,所有的请求都会经过注册的中间件。同时Koa与生俱来支持async/await异步编程模式,代码风格更加简洁。至于洋葱模型什么的大家都清楚,就不废话了。

原理

Middleware 注册(use)

Middleware 编排(koa-compose)

跟Express类似,Koa的 Middleware 也是顺序执行的,通过dispatch函数来控制。代码的编写模式也很像:调用dispatch/next -> 定义dispatch/next -> dispatch/next作为回调递归调用。这里有个地方要注意下,对于 Middleware 来说,它们的await next()实际上就是await dispatch(i)。当执行到最后一个 Middleware 的时候,会触发条件if (i === middleware·length) fn = next,这里的next是undefined,会触发条if (!fn) return Promise.resolve(),继续执行最后一个 Middleware await next()后面的代码,也是洋葱模型由内往外执行的时间点。

Redux

Redux是我所知的第一个将 Middleware 概念应用到客户端的前端框架,它的源码处处体现出函数式编程的思想,让人眼前一亮。

用法

Redux中间件的参数,store是applyMiddleware内部传进来的,next是compose后传进来的,action是dispatch传进来的。这里的设计确实十分巧妙,下面我们结合源码来进行分析。

原理

Middleware 编排(applyMiddleware)

这里compose的返回值又重新赋值给dispatch,说明我们在应用内调用的dispatch并不是store自带的,而是经过 Middleware 处理的升级版。

Middleware 编排(compose)

compose的核心代码只有一行,像套娃一样的将 Middleware 一层一层的套起来,最底层的args就是store.dispatch。

Axios

Axios中没有 Middleware 的概念,但却有类似功能的拦截器(interceptors),本质上都是在数据处理链路的 2 点之间,提供独立的、配置化的、可叠加的额外功能。

用法

Axios的 interceptors 分请求和响应 2 种,注册后会自动按注册的顺序执行,无需像其他框架一样要手动调用next()。

原理

interceptors 注册(use)

可以看到Axios内部会维护 2 个 interceptors,它们有独立的 handlers 数组。use就是往数组添加元素而已,跟其它框架不同的是这里的数组元素不是一个函数,而是一个对象,包含fulfilled和rejected 2 个属性。第二个参数不传的时候rejected就是 undefined。

任务编排

这里通过 promise 的链式调用,将 interceptors 串联了起来,执行顺序是:requestInterceptorChain -> chain -> responseInterceptorChain。这里有一个默认的约定,chain 里的元素都是按照[fulfilled1, rejected1, fulfilled2, rejected2]这种模式排列的,所以注册 interceptors 的时候如果没有提供第二个参数,也会有一个默认值 undefined。

各框架的横向对比

看了各大框架的 Middleware 实现方式之后,我们可以总结出以下几个特点:

  • Middleware 机制既可以用于服务器端也可以用于客户端
  • Middleware 机制本质上是向框架使用者开放数据处理链路上的一个或多个点,增强框架的数据处理能力
  • 绝大多数的 Middleware 都是不依赖于具体业务的可复用的功能
  • 多个 Middleware 可以组合起来实现复杂功能

我们再来总结一下各大框架中间件系统实现方式的精髓:

这里面最精妙也是最难理解的就是Array.reduce这种形式,需要反复地推敲。promise.then链式调用的任务编排方法也十分巧妙,前面处理完的数据会自动传给下一个then。递归调用的形式则最好理解,Koa在Express实现的基础上天然支持异步调用,更符合服务器端场景。

总结

本文从使用方式入手,结合源码讲解了各大前端框架中 Middleware 的实现方式,横向对比了他们之间的异同。当中的递归调用、函数嵌套和 promise 链式调用的技巧非常值得我们借鉴学习。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
这次真怕了!菲律宾海警靠近黄岩岛,却被接下来一幕整懵了!

这次真怕了!菲律宾海警靠近黄岩岛,却被接下来一幕整懵了!

星辰故事屋
2024-11-16 12:16:36
高职院校爆发惨绝人寰的血案:8死17伤,恶魔校友肆意屠戮无辜!

高职院校爆发惨绝人寰的血案:8死17伤,恶魔校友肆意屠戮无辜!

墨下
2024-11-17 06:59:20
突发!江苏无锡一学院21岁毕业生持刀行凶致8死17伤

突发!江苏无锡一学院21岁毕业生持刀行凶致8死17伤

焰冰谈生活
2024-11-17 05:35:42
历时118天!湖北小伙独自划艇漂流长江从攀枝花抵达上海,曾死里逃生多次看到江豚

历时118天!湖北小伙独自划艇漂流长江从攀枝花抵达上海,曾死里逃生多次看到江豚

红星新闻
2024-11-16 16:47:26
陈凯歌表示金鸡奖闭幕后,立马邀请李庚希雷佳音拍戏,原因超好笑

陈凯歌表示金鸡奖闭幕后,立马邀请李庚希雷佳音拍戏,原因超好笑

娱最资讯
2024-11-16 22:39:50
暴涨43%!联想手机逆袭,全靠“调教”摩托罗拉成功了?

暴涨43%!联想手机逆袭,全靠“调教”摩托罗拉成功了?

雷科技
2024-11-15 18:28:54
萝莉岛名单新料:韩国朴彩英被外媒曝照,经不起推敲,粉丝透内情

萝莉岛名单新料:韩国朴彩英被外媒曝照,经不起推敲,粉丝透内情

来条娱吃
2024-11-16 14:11:01
8死17伤!江苏一高职院校发生持刀伤人案,更多详情曝光

8死17伤!江苏一高职院校发生持刀伤人案,更多详情曝光

新兴网评
2024-11-17 02:12:40
正式退出!C罗宣布新决定,葡萄牙足协批准,2026世界杯争冠反转

正式退出!C罗宣布新决定,葡萄牙足协批准,2026世界杯争冠反转

球场没跑道
2024-11-16 10:14:40
油价一夜“倾泻”,全国92,95号汽油大降1005元/吨,11月20日调价

油价一夜“倾泻”,全国92,95号汽油大降1005元/吨,11月20日调价

猪友巴巴
2024-11-16 14:17:25
遵循“一夫一妻制”的动物,若一方死了,它们能经住交配诱惑吗?

遵循“一夫一妻制”的动物,若一方死了,它们能经住交配诱惑吗?

答案在这儿
2024-11-15 15:14:08
全红婵家乡投资326万元修建大桥,婵宝几乎承担一半的资金!

全红婵家乡投资326万元修建大桥,婵宝几乎承担一半的资金!

爱论历史
2024-11-16 08:40:02
外教:森保一应安排替补球员对阵中国 ,这种压力的比赛最锻炼人

外教:森保一应安排替补球员对阵中国 ,这种压力的比赛最锻炼人

星耀国际足坛
2024-11-16 23:54:02
让北宋头痛不已的契丹,是现在哪个民族,说出来你可能不信

让北宋头痛不已的契丹,是现在哪个民族,说出来你可能不信

诗词中国
2024-11-15 15:27:47
特朗普任命白宫通讯主任,首个华裔成员?

特朗普任命白宫通讯主任,首个华裔成员?

观察者网
2024-11-16 18:19:02
特朗普终止美国的出生公民权!这是帮我们涨人口留资产的好政策

特朗普终止美国的出生公民权!这是帮我们涨人口留资产的好政策

大风文字
2024-11-16 09:26:42
离场抗议,科索沃球员退场后在更衣室里吃披萨并留下一地垃圾

离场抗议,科索沃球员退场后在更衣室里吃披萨并留下一地垃圾

懂球帝
2024-11-16 12:28:15
黄晓明憔悴发声:会处理好叶珂的事 鞠躬时大拇指 和皮鞋被疯狂热议

黄晓明憔悴发声:会处理好叶珂的事 鞠躬时大拇指 和皮鞋被疯狂热议

奇特短尾矮袋鼠
2024-11-16 20:50:23
就在刚刚,证券市场突发王炸消息,其中一条散户们看完都沸腾了!

就在刚刚,证券市场突发王炸消息,其中一条散户们看完都沸腾了!

一丛深色花儿
2024-11-17 00:36:31
明明自己半瓶水,还敢来金鸡奖当评委,难怪评论区沦陷全是质疑

明明自己半瓶水,还敢来金鸡奖当评委,难怪评论区沦陷全是质疑

娱乐的小灶
2024-11-17 00:37:38
2024-11-17 08:48:49
爱创乐育
爱创乐育
努力成为别人心中的大神
30文章数 134关注度
往期回顾 全部

科技要闻

杨植麟:每月有3600万用户在使用kimi

头条要闻

牛弹琴:中国元首会见拜登 说的5句话很意味深长

头条要闻

牛弹琴:中国元首会见拜登 说的5句话很意味深长

体育要闻

双手沾满鲜血的童年,塑造了NBA最拼命的球员

娱乐要闻

金鸡奖:赵丽颖未获奖,王骁拿奖

财经要闻

中铁七局致歉!对5人就地免职

汽车要闻

越野拉满 东风猛士917高地雄狮售69.9万元

态度原创

旅游
教育
亲子
游戏
公开课

旅游要闻

山东日照迎首批免签入境韩国旅客

教育要闻

这是家长觉醒了吗?家长投诉老师:极度追求自身成绩的利己者

亲子要闻

当娃到了狗都嫌的年纪,家长有多崩溃?网友:没有一天省心的

永劫无间:新人当道,老将凋零?S1老兵仅剩Mike一人晋级劫杯!

公开课

一块玻璃,如何改变人类世界?

无障碍浏览 进入关怀版