网站首页 > 开源技术 正文
在Node.js中说到web框架大家首先想到的就是express,这个极简的web框架算得上Node.js web框架的元老了.生态丰富.
fastify作为我现在的主力框架,以前用express,今天我谈谈我为什么放弃express拥抱fastify.
性能
这个毫无质疑,fastfiy的运行hello world的QPS就比expres高1.5倍,成品下来至少是2倍以上的差距.当然,性能不能作为唯一的参考标准.好用才是硬道理.
async/await支持
相信不少Node.js开发者都是因为异步回调(callback),放弃了Node.js的.是的,callback在写法上和理解上都很困难.
现在都2020了,遗憾的是express对async/await支持的还是不好,主要体现在:
- handler无法直接返回Promise
- async函数throw错误必须在handler内处理
反观fastify,async/await支持的就比较好
handler可以直接返回Promise<string>,Promise<Buffer>,Promise<Stream>,Promise<Object>
或者直接throw一个错误
示例:
fastify.get('/object',async ()=>{
return {hello:'world'}
})
fastify.get('/stream',async (req, reply)=>{
reply.type('image/png')
return fs.createReadStream('./a.png')
})
fastify.get('/buffer', async (req, reply)=>{
reply.type('text/plain')
return Buffer.from('hello')
})
fastify.get('/err',async (req, reply)=>{
const err = new Error('错误!')
err.statusCode = 403
throw err
})
扩展性
express使用了中间件的方式扩展应用,但是中间件也是有很多弊端.主要体现在:
- 中间件加载其实是有先后顺序的,但是中间件自身却无法管理这种顺序,只能交给使用者。这样其实非常不友好,一旦顺序不对,结果可能有天壤之别。
- 中间件的定位是拦截用户请求,并在它前后做一些事情,例如:鉴权、安全检查、访问日志等等。但实际情况是,有些功能是和请求无关的,例如:定时任务、消息订阅、后台逻辑等等。
- 有些功能包含非常复杂的初始化逻辑,需要在应用启动的时候完成。这显然也不适合放到中间件中去实现。
而fastify的扩展机制就显得强大得多,除了中间件外.fastify本着一切皆插件的理念.可以使用强大的插件系统.
fastify的插件系统可以将项目模块化,在每个模块类似js的作用域,把模块之间隔离开,可以使用父级的资源(中间件,Hook,decorate等)但是不能使用其他同级或者非父级的资源.
示例:
在server.js中
const fastify = require('fastify')()
//加载插件
fastify.register(require('./home.js'))
fastify.register(requuire('./admin.js'))
在home.js中
module.exports = async (fastify)=>{
fastify.get('/home',async ()=>{
return 'home'
})
}
在admin.js中
module.exports = async (fastify)=>{
fastify.register('./test.js')
fastify.get('/home',async (req)=>{
return req.data
})
}
在test.js中
const fp = require('fastify-plugin')
module.exports = fp(async (fastify)=>{
//使用装饰器
fastify.decorateRequest('data','admin')
//添加hook
fastify.addHook(...)
//使用中间件
fastify.use(...)
})
猜你喜欢
- 2024-10-22 调用 Express API时出现奇怪的CORS错误怎么办?
- 2024-10-22 详解如何从零开始搭建Express+Vue开发环境
- 2024-10-22 从零开始学习nodejs+express--交互环境
- 2024-10-22 express开发(一)简介与搭建(express创建项目)
- 2024-10-22 express中间件原理connect(express和koa中间件原理的区别)
- 2024-10-22 蓝易云 - centos系统直接部署express教程。
- 2024-10-22 Node + Express + Mysql: Todo List项目让你成全栈
- 2024-10-22 我为 Express 开了外挂(cad中的express怎么显示为中文)
- 2024-10-22 七爪源码:让我们 Dockerize 一个 Node.js Express 应用程序
- 2024-10-22 Node实战篇:Express--jade模板引擎(七)
你 发表评论:
欢迎- 03-19基于layui+springcloud的企业级微服务框架
- 03-19开箱即用的前端开发模板,扩展Layui原生UI样式,集成第三方组件
- 03-19SpringMVC +Spring +Mybatis + Layui通用后台管理系统OneManageV2.1
- 03-19SpringBoot+LayUI后台管理系统开发脚手架
- 03-19layui下拉菜单form.render局部刷新方法亲测有效
- 03-19Layui 遇到的坑(记录贴)(layui chm)
- 03-19基于ASP.NET MVC + Layui的通用后台开发框架
- 03-19LayUi自定义模块的定义与使用(layui自定义表格)
- 最近发表
-
- 基于layui+springcloud的企业级微服务框架
- 开箱即用的前端开发模板,扩展Layui原生UI样式,集成第三方组件
- SpringMVC +Spring +Mybatis + Layui通用后台管理系统OneManageV2.1
- SpringBoot+LayUI后台管理系统开发脚手架
- layui下拉菜单form.render局部刷新方法亲测有效
- Layui 遇到的坑(记录贴)(layui chm)
- 基于ASP.NET MVC + Layui的通用后台开发框架
- LayUi自定义模块的定义与使用(layui自定义表格)
- Layui 2.9.11正式发布(layui2.6)
- Layui 2.9.13正式发布(layui2.6)
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)