首页 文章 精选 留言 我的

精选列表

搜索[Web安全],共10000篇文章
优秀的个人博客,低调大师

Web技术】904- Express/Koa/Redux三者中间件对比

Author:AddOneG Link:http://yoursite.com/2018/09/14/express-koa-redux三者中间件对比/ 这三者对各自的中间件有着不同的实现,作者本人对此也比较好奇,在这里小小的研究一下源码,探究三者之间的异同 什么是中间件 在我看来,中间件就是在你的代码运行中进行一些修改的工具。比如你想喝水,那么喝水之前你将水净化就可以理解为是一次中间件的执行。他不是插件,独立于程序之外,而更像是在你的代码中表现一种类似连接的功能 Koa 与 Express 中间件概述 这两者都是Node层面的,这里我们根据官方文档来对比 Express varapp=express();//没有挂载路径的中间件,应用的每个请求都会执行该中间件app.use(function(req,res,next){console.log('Time:',Date.now());next();});//挂载至/user/:id的中间件,任何指向/user/:id的请求都会执行它app.use('/user/:id',function(req,res,next){console.log('RequestType:',req.method);next();});//路由和句柄函数(中间件系统),处理指向/user/:id的GET请求app.get('/user/:id',function(req,res,next){res.send('USER');}); 可以看到express的中间件是使用next进行线性调用的,一个接着一个的执行,是一种尾递归的调用(后文会讲)。然后在最后一个中间件中进行对response的处理(习惯) Koa constKoa=require('koa');constapp=newKoa();//x-response-timeapp.use(async(ctx,next)=>{conststart=Date.now();awaitnext();constms=Date.now()-start;ctx.set('X-Response-Time',`${ms}ms`);});//loggerapp.use(async(ctx,next)=>{conststart=Date.now();awaitnext();constms=Date.now()-start;console.log(`${ctx.method}${ctx.url}-${ms}`);});//responseapp.use(asyncctx=>{ctx.body='HelloWorld';});app.listen(3000); 从代码中的await可以看出,koa的中间件绝对不是线性的,因为一旦使用了await,代码就会停止当前中间件的执行转而去执行await后面的代码,这里next表示下一个中间件。所以这是一个支持generator的洋葱圈模型(后文会讲) Koa 与 Express 中间件源码进一步解析 上面提到,express的中间件是尾递归调用,而koa的中间件因为使用了await所以是支持generator的洋葱圈模型,这里以此展开来分析代码 Express 我们直接进入application.js中观察中间件处理 app.handle=function(req,res,callback){varstack=this.stack;varidx=0;functionnext(err){if(idx>=stack.length){callback('err')return;}varmid;while(idx<stack.length){mid=stack[idx++];mid(req,res,next);}}next()} 这里next方法不断取出stack中的中间件并且将自己传递给中间件作为参数,这样中间件只需要调用next方法就能不断传递到下一个中间件。在函数的末尾递归调用了next方法,所以称为尾递归调用 Koa Koa对中间件的处理是在一个独立的包koa-compose中 'usestrict'module.exports=composefunctioncompose(middleware){returnfunction(context,next){letindex=-1returndispatch(0)functiondispatch(i){index=iletfn=middleware[i]if(i===middleware.length)fn=nextif(!fn)returnPromise.resolve()try{returnPromise.resolve(fn(context,dispatch.bind(null,i+1)));}catch(err){returnPromise.reject(err)}}}} Koa中使用了Promise来支持异步,这里不停调用dispatch.bind(null, i + 1)传递下一个中间件,一个一个中间件向里执行,直到最后一个中间件执行完resolve掉,然后不断向前resolve中间件,直到第一个中间件被resolve。我们可以发现,相应的处理并不在中间件中而是在其resolve后 Redux 对于redux的基础createStore,reducer,dispatch等就不解释了,这> 里直接看applyMiddleware的代码 importcomposefrom'./compose'exportdefaultfunctionapplyMiddleware(...middlewares){returncreateStore=>(...args)=>{conststore=createStore(...args)letdispatch=()=>{thrownewError(`Dispatchingwhileconstructingyourmiddlewareisnotallowed.`+`Othermiddlewarewouldnotbeappliedtothisdispatch.`)}constmiddlewareAPI={getState:store.getState,dispatch:(...args)=>dispatch(...args)}constchain=middlewares.map(middleware=>middleware(middlewareAPI))dispatch=compose(...chain)(store.dispatch)return{...store,dispatch}}} 这里还是比较好理解的,middlewareAPI中包含两个api,一个是store的getState;另一个是覆写的dispath,这是一个外部变量,最终指向覆写后的dispach,对于compose的作用是compose(f, g, h) 返回 () => f(g(h(..args))) 那么dispatch = compose(...chain)(store.dispatch)即原生的 store.dispatch 传入最后一个“中间件”,返回一个新的dispatch ``, 再向外传递到前一个中间件,直至返回最终的dispatch`, 当覆写后的dispatch调用时,每个“中间件“的执行又是从外向内的”洋葱圈“模型 1. JavaScript 重温系列(22篇全) 2. ECMAScript 重温系列(10篇全) 3. JavaScript设计模式 重温系列(9篇全) 4. 正则 / 框架 / 算法等 重温系列(16篇全) 5. Webpack4 入门(上) || Webpack4 入门(下) 6. MobX 入门(上) || MobX 入门(下) 7. 100 +篇原创系列汇总 回复“加群”与大佬们一起交流学习~ 点击“阅读原文”查看 100+ 篇原创文章 本文分享自微信公众号 - 前端自习课(FE-study)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

前端搞 Serverless | 张挺 - 如何用函数框架快速开发大型 Web 应用

前端早早聊大会,前端成长的新起点,与掘金联合举办。 加微信 codingdreamer 进大会专属女生前端群和内推群。 第十三届|前端构建专场,8-15 即将直播,8 位讲师(蚂蚁金服/淘宝等),点我上车 (报名地址): 正文如下 本文是第六届 - 前端困惑的 Serverless,也是早早聊第 33 场,来自 阿里巴巴的 — 张挺 的分享。 1. 个人介绍 大家好,我是阿里巴巴淘系技术部基础架构组的张挺(花名),真名陈仲寅,平时社区看到 Harry Chen,czy88840616 都是我。 我今天给大家带来的是5分钟发布一个Serverless application,为什么是5分钟呢,有科学研究,人发呆的最短时间大概就是5分钟,一不小心就过去5分钟,也说明在 Serverless 体系下,开发和发布的便捷。 我当前负责的是集团的 Node.js 基础架构部分,支撑集团的 Node.js 中间件体系,midway 系列以及相应的插件,Nodejs 监控以及各种跟 Node.js 相关的工作,在开源社区,同时也维护整个 Midwayjs 体系,包括 Midway,Pandora,Sandbox 以及新出的 Midway-FaaS 体系。 同时,从2年前开始,我们就在一直做 Typescript 的推进,以及集团中间件标准定义的支持,未来应该是 TS 的天下。 最近正在负责经济体 Serverless Node.js 方向的基建,包括 yml 的标准化,能力的复用,以及框架、运行时、插件的稳定性。 2. 大纲 介绍 Serverless 当前集团以及社区体系的一些内容,以及各家云平台的对比,国内的主要是阿里云和腾讯云两家,以及我们现在使用 Serverless 的一些方案,分享这些方案能实现的一些内容,以及这些方案的一些风险; 穿插一些示例,将 Midway FaaS 体系的能力展现给大家; 面向未来,介绍一些未来的方向; 3. 为什么要使用 Serverless 体系 第一个问题,为什么要有 Serverless,它跟前端有什么关系? 这个问题,作为基础架构团队,从前年底开始就一直在研究和思考。其实一开始,并不是说要有 Serverless。从前年开始,集团一共有约 2000+的 Node.js 应用,有非常多的中后台系统,大多日常CPU 低于 5%,甚至有 0.5%的,每个应用都会配多台机器,这给集团造成很大的资源浪费。所以第一个诉求,就是要减少资源成本,特别是中后台。 第二块,前面有嘉宾也介绍过,前端其实也到了一个瓶颈期,从最开始的切图仔,到前后端分离,BFF 全栈,是时候需要一个被认可,能产出的方向,意味着,从前端的智能,扩大到整个应用,不仅仅会思考页面的部分,也会从全局考虑数据流、架构,这对前端整体的架构素质,有着非常大的提升。 基于以上这两个目的,我们开始对 Serverless 从 0 开始做实践,集团去年经历了双促,也扩展到了基本上所有 BU,在中后台,C 端都有不同的实践,算是欣欣向荣。基于这些实践,开源了我们针对 Serverless 体系而设计的 Midway FaaS 框架。 4. 前端的诉求 在国内社区,云服务商只有两个,阿里云和腾讯云。云服务商希望能扩大市场,这跟营收有关,另外一块,云资源,本身也是资源,虽然有超卖(比如一核,卖出两核)但是资源本身也需要精细化管理。 而对于社区用户,中小型开发者,你跟他说 Serverless,他思考的就是以下几个问题,我拿他做什么,和之前的区别是什么,选哪个平台,怎么简单的还是先,我的老代码怎么办,以及最重要的,我到底要花多少钱。碰到钱这个话题,大家都很敏感,我也是,前几天测试的时候,aws 每天向我收 0.08 美分,我还不知道为什么,我就很焦虑。以上就是我们所有的前端自己的诉求。 5. 社区和生态 那既然社区有这么多云平台来支持,那来看一下社区的生态是怎样子的? 5.1 语言支持 我们在去年进行了大量的调研,那么也包括了国外的一些平台,包括亚马逊,谷歌,微软以及国内的这些厂商,这么多的平台大体有一个特点。在语言支持的方面是非常偏向,整个体系对 Node.js 支持达到了70%以上,而其他的语言支持力度会非常的小,特别是 Java 和 .Net 这些在传统很占优势的一些语言。这些语言,就在 Serverless 体系上就不会过得非常好,这也是由于它的效率和速度决定的。一个 Java 启动,2G 内存,而Node只占 128M。 5.2 能力支持 那么在能力知识方面,我们对各大厂商也做了一些对比,如图所示,目前看起来密密麻麻,其实我们最多能用到的在售的体系或者函数体系的服务,基本上都已经包括了包括常见的对象存储、消息队列、定时任务和日志,还有前端最常用的 Http 能力都非常的有用。 6. 2019 前端四大方向 而另一边跟前端密切相关的,2019 年的前端四大方向,因为 2020 年还没有出,那么我们看到 Serverless 是其中的一大方向,特别是在阿里前端委员会的大力支持下,我们也在集团和的社区进行一路的推广和技术支持。 它的工作原理,我相信大家也都比较清楚了,这是亚马逊的一张非常通俗易懂的图,也是非常深入人心的上面演示了受累是从调用到最后执行和收费的,整个流程可以很清晰的看到,函数的动态扩容,按量付费等高级特性。。 还是回归到用户本身我们刚才有些疑问,如果我是一个用户,那么 Serverless 到底是服务于些场景,我到底能做什么? 借用友商的一些图来表示,在社区上做得最多的有静态网站的托管,我会去 GDP 的 Epik High 以及把这些组合起来用来替代传统应用的这种全栈模型。 7. 阿里用来做什么? 导购场景,就是淘宝首页和飞猪首页这些营销的列表,它的流量在双十一也会非常大的,但是也是平稳的度过了; 中后台场景,我刚才说了我们的资源浪费的情况,我们要把这些传统的浪费的资源节省下来,并且能够希望逐步逐步地,没有人去访问的时候,把容器的资源缩到 0,然后应用就自然下线; RPC 场景,hsf 社区是 Dubbo,我们也是用函数承载的; 这些前端都能参与,也变相的让前端的职能逐步进行了扩大。 8. 目标 而今年我们的目标就是成本,当然也是一个希望,能将传统 80% 的能力支持掉,同时也节省掉上面所说的那些机器。 9. 方法 当前的应用上函数有两种,分别有不同的人在推进,直接把大应用迁移(老应用),或者直接重写(新应用),刚才嘉宾光毅介绍的是我们把整个原 egg 应用部署到函数体系中,而另一块,也是我们在主导的,使用一个复用大部分传统能力的新的框架来支持函数。 两种模式是天然的试错,我们觉得传统框架直接上函数有一定的风险,这个风险就在于传统框架的不确定性。 传统框架是为多进程,启动时间不明感,以及状态存储而设计的,而在函数场景下,我们觉得需要变的更纯粹,调用和执行方式也不同,所以才将原来的 Midway 的核心抽离,产生了更轻量,启动更快速,单进程设计的 Midway FaaS 框架。 10. Midway FaaS 体系结构 整个 Midway FaaS 体系包括三个部分,CLI 部分,本地多云开发,调试,以及社区的多平台发布,第二块是传统框架的能力,依赖注入,应用分环境配置,以及组件复用,扩展性等等,第三块是标准化,包括yml标准,前端调用函数标准,以及适用于私有化运行时部署的运行时标准。 11. 示例 下面是示例部分,这次我带来了三个示例,分别介绍不同的能力,如果需要跟着我做,一些准备工作需要提前完成。 11.1 准备工作 11.2 示例一 第一个示例,我会演示纯函数如何发布成 HTTP API,以及如何在本地进行开发,调试。 1、介绍目录结构,每个文件的作用; 2、介绍 f.yml 的内容; 3、介绍函数的入口,大体结构,类写法; 4、测试的方法; 功能演示: 1、f invoke -f index 调用函数 2、f invoke -p + 修改实时生效 修改文本 hello world111,实时生效,我们的本地服务,模拟了网关的能力 3、修改返回值为 html,增加 type ,我们的定义,让习惯 koa 的人很熟悉,也通过它,也可以方便的直接使用 koa 中间件,按 F12 查看请求 4、启动调试能力,invoke -p —debug 5、演示部署到[腾讯云](https://l.gushuji.site/tencent)和[阿里云](https://l.gushuji.site/aliyun) 11.3 示例二 第二个示例是一个一体化示例,什么是一体化呢,就是前端 + 后端在一起开发,一起部署,在大多数的中后台场景中都非常的适用,同时请记住,我们的示例都是跨多云的,第二个示例我将演示发布到阿里云,而第三个示例我将演示发布到腾讯云。 功能演示: 1、f create 选择 vue 示例 2、本地打开,介绍vue的组件,函数的子目录,以及 faas 的vue 插件 3、启动 http://127.0.0.1:8080/ 查看 vue 渲染,强调本地只启动一个端口,前后端完全在一个仓库中开发(本身就是一个人 4、F12 查看函数接口,修改函数接口,刷新返回 5、尝试发布[阿里云](https://l.gushuji.site/aliyun),发布前停顿,介绍高密度 6、尝试访问 vue-scf.mdemo.cn 11.4 示例三 第三个示例是一个复杂的全栈应用,我们增加了数据的部分,这里采用了阿里云的 OTS 来存储,实际情况下你也可以使用自己的 MySQL 或者其他数据库。 由于代码相对复杂,我们进行了分层,将规则和用户接口进行了抽象。 代码结构 功能演示 1、由于包含秘钥,还未上传,后面会有 2、介绍目录结构,函数的目录,数据库的分层,解耦,重点,看上去是应用,实际是按接口维度的函数 3、这次我们发布[腾讯云](https://l.gushuji.site/tencent),我把之前的删掉了,访问一下看看 qy-scf.demo.cn 确认是没部署的情况 4、然后 deploy,再次访问,对比同样一份在[阿里云](https://l.gushuji.site/aliyun)的代码 qy.demo.cn,做一些更新操作,两边数据同步 示例演示就到这里,我们展示了三种不同类型的,基于 midway faas 的函数开发模型,既有简单的纯函数提供 HTTP 接口,也有复杂的中后台应用,对中小型开发者开发日常的博客,中后台都有很大的帮助。 12. 面向未来 第三部分,我们面向未来,看看之后要做的事情。 Serverless 是一个非常适合前端去开拓和挖掘的一个新体系,他的轻量和面运维让前端不用自己去维护服务器本身,而更专注逻辑部分,同时,也非常适合小公司,个人开发者搭建自己的官网、接口,服务。 Midway FaaS 对于我们来说,是一个在新场景下的函数框架,希望能帮助用户在函数体系下更好的在代码层面解决问题。我们在不断寻找新场景的同时去追求极致的启动速度。 另外,也能在框架层面,希望和各个云平台携手共赢,把整个生态支撑起来。 后面,我们也会考虑将单体应用和 FaaS 的互转,甚至是协同,在 IoC 体系是可以做到的。 另外,也会开始支持其他的平台,比如 aws,以及腾讯的 Component。 13. Thanks 最后,我们也在持续招人,欢迎沟通,谢谢大家阅读。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册