【fastify】express最好的替代品

1,260 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

今天介绍一下最近常用的web框架:Fastify,以及我最近的一个小想法

什么是fastify

从官网的介绍上来看,www.fastify.cn/

fastify是一个 web 开发框架,其设计灵感来自 Hapi 和 Express,致力于以最少的开销和强大的插件结构提供最佳的开发体验。据我们所知,它是这个领域里速度最快的 web 框架之一。

基本使用

从API上来看,fastify和express是基本差不多的. 先安装

npm install fastify

启动一个简单的服务

//index.js
const fastify = require('fastify')({ logger: true })

//声明一个最简单的路由
fastify.get('/', async (request, reply) => {
  return { hello: 'world' }
})

//启动服务
setImmediate(async () => {
    try {
        await fastify.listen(process.env.PORT||3000,'0.0.0.0')
    } catch (err) {
        fastify.log.error(err)
        process.exit(1)
    }
})

这样就在本地端口3000上启动了一个简单的服务。打眼望去,整个框架完全支持async/await,写法上基本与express相同,但是减少了很多配置,例如不用配置body的解析,fastify将根据返回值自动处理。

使用插件

插件的使用也和express也差不多,而且基本上express常用的插件也有对应的fastify版本

fastify.register(
    require('fastify-cors'),
    {
        optionsSuccessStatus:204
    }
)

配置式API

fastify 还支持配置式API,例如

fastify.route({
    method:'GET',
    url:'/123'
    async handler(req,reply){
    return "who's your daddy"
    }
})

一个简单的代理服务

本地开发的时候,经常需要对接本地或者三方的接口,很容易碰见跨域问题,这时候你就需要一个代理服务,当然你可以通过配置webpack实现,但是使用fastify会有一种更简单的方法

const fastify = require('fastify')({
    logger: true
})
const to = require('await-to-js').default
const request = require("request-promise");
const baseUrl = 'http://192.168.0.199:8080'
fastify.register(
    require('fastify-helmet'),
    // Example disables the `contentSecurityPolicy` middleware but keeps the rest.
    { contentSecurityPolicy: false }
)
fastify.register(
    require('fastify-cors'),
    {
        optionsSuccessStatus:204
    }
)

fastify.get('/', async (request, reply) => {
    return 'hello world'
})

fastify.route({
    method: ['GET','POST','PUT','DELETE'],
    url: '*',
    handler: async (req, reply) => {
        const options = {
            method: req.method,
            uri: baseUrl + req.url,
            json: true
        }
        if(req.query){
            options.qs = req.query
        }
        if(['POST','PUT'].includes(req.method)){
            options.body = req.body
        }
        return await request(options)
    }
})

setImmediate(async () => {
    try {
        await fastify.listen(process.env.PORT||3000,'0.0.0.0')
    } catch (err) {
        fastify.log.error(err)
        process.exit(1)
    }
})

那么大家又选择了什么web开发框架呢?欢迎评论区讨论留言