编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

Node.js框架fastify对比express优势

wxchong 2024-10-22 17:54:33 开源技术 6 ℃ 0 评论

在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(...)
})

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表