超輕量級web框架koa源碼瀏覽

koa是一個非常輕量的web框架,內里除了ctx和middleware以外什麼都沒有,甚至連最基礎的router功用都須要經由過程裝置其他中間件來完成。不過雖然簡樸,然則它卻非常壯大,僅僅依託中間件機制就能夠夠構建完全的web效勞。而koa的源碼一樣很簡約,基礎代碼只需不到2000行,非常合適瀏覽進修。

koa的源碼直接從github獵取,本文採納現在最新的2.5.1版本。

代碼組織

第一眼看到koa的源碼時刻我真的懵了,重複確認沒有看錯以後才確信,koa源碼只需四個文件–application.js,context.js,request.js,response.js,位於項目的lib文件夾下。而且一看文件名基礎上就能夠猜到每一個文件是做什麼的了,接下來就是翻開檢察內里的內容。

koa基礎啟動流程

起首看package.json內里的main,能夠曉得application.js是進口文件,內里是一個繼續自event模塊下的Emitter類的Application類,我們運用koa時刻建立的app實例就是在這裏定義的。

剖析一個類天然要先看它的組織函數,內里重點的就是定義了一個數組middleware,另有三個屬性context,request,response分別為三個對象,而這三個對象就是在對應的其他三個文件中定義的。在此我們先不看別的的文件,想一想我們運用koa的時刻,建立app實例以後,接下來就是use種種中間件了,所以直接看use要領。

use吸收一个中間件函數作為參數,起首做範例校驗,假如傳入的是generator,在koa2中會先經由過程convert舉行轉換(此處是為了兼容koa1,後續版本將移除),末了實在只做了一件事,就是把這個函數push到middleware數組中去。use要領末了會返回this,也就是koa實例自身,這就意味着我們能夠完成鏈式挪用。

設置好中間件,我們開啟koa效勞的末了一步就是挪用listen要領設置監聽端口,接下來就看一下listen要領的完成。我們會發明listen更簡樸,只需兩行,實在什麼分外的事變也沒做,只是挪用了node原生的http模塊下面的createServer要領建立效勞,listen要領設置監聽,僅此而已。我們都曉得http的createServer須要傳入一個函數,這個函數在koa內里是經由過程挪用callback要領返回的,接下來看callback的完成。

callback內里起首運用compose把統統的中間件變成一個函數(compose的完成一樣後續會詳細剖析),這裡會起首挪用Emitter中的listenerCount要領推斷是不是有error事宜的監聽器,假如沒有會為error事宜註冊默許的事宜監聽要領onerror,以後就是定義我們要的誰人傳入createServer的函數了。這個函數吸收req和res兩個參數,以後,koa會對其做一個處置懲罰:經由過程挪用createContext要領把req和res封裝成我們熟習的ctx對象(createContext詳細做了哪些事情接下來會說),然後把ctx和之前處置懲罰好的中間件函數fnMiddleware傳入handleRequest要領中。

handleRequest中起首先掏出res,先把狀況置為404,然後對實行中間件后的勝利和失利狀況註冊要領,失利挪用ctx.onerror捕捉非常,勝利挪用respond要領處置懲罰效果。這裏照樣用了onFinished模塊,onFinished能確保一個流在封閉、完成和報錯時都邑實行相應的回調函數,這裏把我們的非常處置懲罰函數傳入用以處置懲罰毛病信息。而respond要領,內里做的,就是讀取ctx信息,把數據寫入res中並相應要求。至此,全部流程就完成了。

ctx的建立

createContext內里的代碼實在迥殊簡樸,就是建立了三個對象context,request,response,然後把運用ctx時刻的種種東西都掛到context對象上,如許我們就能夠夠在ctx上面獵取到req,res等等種種信息了。建立context,request,response對象時刻用到了當前app類內里的三個對象,它們是經由過程從外部三個文件中引入的對象來建立的,所以接下來就看一下這三個文件中都有什麼。

這三個文件導出的都是對象,在context中,只做了一些基礎要領的定義,剩下的統統屬性要領全部都運用delegate代理到request和response屬性的接見了。而前面我們已曉得,context上面的request和response就是經由過程別的的兩個文件中的對象建立獲得的。而這兩個文件的內容就越發簡約了,都是我們日常平凡運用時刻接見的屬性和要領,經由過程getter和setter的體式格局來掌握上面的req和res從而完成對現實要乞降相應操縱的封裝。因而全部koa中間的四個文件就完全完成了。

compose完成道理與中間件機制

起首做一些合法性校驗,重點在於末了的返回效果是一個函數,這個函數就是我們上面的fnMiddleware,它一樣也有context和next兩個參數,在其內部採納index變量紀錄當前處置懲罰到哪一个中間件,然後從第一個最先挪用dispatch要領。起首會推斷當前傳入參數與index的關聯,假如在一个中間件內屢次挪用next,會湧現參數小於index的狀況,此時就會報錯。以後把當前中間件從數組中掏出來,每次實行時會把ctx和next傳入,next中挪用dispatch,參數為下一個位置,如許就會按遞次把中間件增加進來,末了當i即是中間件數組長度時刻,也就是沒有其他中間件了,那末實行一最先傳入的next參數,假如fn不存在,返回空的promise。當中間實行完,也就是前一个中間件的next實行完,天然會觸發await向下實行,以後實行權會反向遞次返回,終究組合的效果就是先從外向里,再从里向外,就是我們熟知的洋蔥圈模子。

《超輕量級web框架koa源碼瀏覽》

毛病處置懲罰機制

koa的毛病處置懲罰機制也很有特性,我們只需監聽koa實例的error事宜,就能夠夠一致處置懲罰統統的毛病。我們在前面提到過,挪用fnMiddleware失利後會被一致的onerror要領捕捉,這個要領是對應到ctx上的onerror要領,我們來看一下內里的完成,內里非常重要的一行就是this.app.emit('error', err, this);,因為我們的koa是繼續自event,所以能夠派發出一個error事宜,我們只需處置懲罰該事宜即可。而前面在中間件處置懲罰中,假如發作毛病就會reject,天然能夠被catch捕捉到。

以上,就是koa基礎中間模塊的流程,道理很簡樸,然則合營種種中間件,koa完全能夠完成一個功用完全web server。

本文原創,情願分享但轉載請提早示知,更多文章檢察我的主頁,謝謝瀏覽,如毛病迎接斧正。

    原文作者:fx109138
    原文地址: https://segmentfault.com/a/1190000014779645
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞