在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>/<stream>/<buffer>/<string>
或者直接throw一個錯誤
示例:
<code>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
})/<code>
擴展性
express使用了中間件的方式擴展應用,但是中間件也是有很多弊端.主要體現在:
- 中間件加載其實是有先後順序的,但是中間件自身卻無法管理這種順序,只能交給使用者。這樣其實非常不友好,一旦順序不對,結果可能有天壤之別。
- 中間件的定位是攔截用戶請求,並在它前後做一些事情,例如:鑑權、安全檢查、訪問日誌等等。但實際情況是,有些功能是和請求無關的,例如:定時任務、消息訂閱、後臺邏輯等等。
- 有些功能包含非常複雜的初始化邏輯,需要在應用啟動的時候完成。這顯然也不適合放到中間件中去實現。
而fastify的擴展機制就顯得強大得多,除了中間件外.fastify本著一切皆插件的理念.可以使用強大的插件系統.
fastify的插件系統可以將項目模塊化,在每個模塊類似js的作用域,把模塊之間隔離開,可以使用父級的資源(中間件,Hook,decorate等)但是不能使用其他同級或者非父級的資源.
示例:
<code>在server.js中
const fastify = require('fastify')()
//加載插件
fastify.register(require('./home.js'))
fastify.register(requuire('./admin.js'))
在home.js中
module.exports = async (fastify)=>{
\tfastify.get('/home',async ()=>{
\treturn 'home'
})
}
在admin.js中
module.exports = async (fastify)=>{
fastify.register('./test.js')
\tfastify.get('/home',async (req)=>{
\treturn req.data
})
}
在test.js中
const fp = require('fastify-plugin')
module.exports = fp(async (fastify)=>{
//使用裝飾器
\tfastify.decorateRequest('data','admin')
//添加hook
fastify.addHook(...)
//使用中間件
fastify.use(...)
})/<code>
閱讀更多 廖亮 的文章
關鍵字: Node.js