前言
koa.js是最流行的node.js后端框架之一,有很多網站都使用koa進行開發,同時社區也涌現出了一大批基于koa封裝的企業級框架。然而,在這些亮眼的成績背后,作為核心引擎的koa代碼庫本身,卻非常的精簡,不得不讓人驚嘆于其巧妙的設計。
在平時的工作開發中,筆者是koa的重度用戶,因此對其背后的原理自然也是非常感興趣,因此在閑暇之余進行了研究。不過本篇文章,并不是源碼分析,而是從相反的角度,向大家展示如何從頭開發實現一個koa框架,在這個過程中,koa中最重要的幾個概念和原理都會得到展現。相信大家在看完本文之后,會對koa有一個更深入的理解,同時在閱讀本文之后再去閱讀koa源碼,思路也將非常的順暢。
首先放出筆者實現的這個koa框架代碼庫地址:simpleKoa
需要說明的是,本文實現的koa是koa 2版本,也就是基于async/await的,因此需要node版本在7.6以上。如果讀者的node版本較低,建議升級,或者安裝babel-cli,利用其中的babel-node來運行例子。
四條主線
筆者認為,理解koa,主要需要搞懂四條主線,其實也是實現koa的四個步驟,分別是
封裝node http Server 構造resquest, response, context對象 中間件機制 錯誤處理下面就一一進行分析。
主線一:封裝node http Server: 從hello world說起
首先,不考慮框架,如果使用原生http模塊來實現一個返回hello world的后端app,代碼如下:
let http = require('http');let server = http.createServer((req, res) => {res.writeHead(200);res.end('hello world');});server.listen(3000, () => {console.log('listenning on 3000');});實現koa的第一步,就是對這個原生的過程進行封裝,為此,我們首先創建application.js實現一個Application對象:
// application.jslet http = require('http');class Application {/*** 構造函數*/constructor() {this.callbackFunc;}/*** 開啟http server并傳入callback*/listen(...args) {let server = http.createServer(this.callback());server.listen(...args);}/*** 掛載回調函數* @param {Function} fn 回調處理函數*/use(fn) {this.callbackFunc = fn;}/*** 獲取http server所需的callback函數* @return {Function} fn*/callback() {return (req, res) => {this.callbackFunc(req, res);};}}module.exports = Application;然后創建example.js:
let simpleKoa = require('./application');let app = new simpleKoa();app.use((req, res) => {res.writeHead(200);res.end('hello world');});app.listen(3000, () => {console.log('listening on 3000');});可以看到,我們已經初步完成了對于http server的封裝,主要實現了app.use注冊回調函數,app.listen語法糖開啟server并傳入回調函數了,典型的koa風格。
新聞熱點
疑難解答
圖片精選