1、入口
const?Koa =?require('koa');
const?app =?new?Koa();
require在查找第三方模塊時叛赚,會查找該模塊下package.json文件的main字段澡绩,查看koa倉庫目錄下下package.json文件,可以看到模塊暴露的出口是lib目錄下的application.js文件
進(jìn)入lib/appplication.js文件是向外導(dǎo)出了創(chuàng)建class實例的構(gòu)造函數(shù)俺附,它繼承了events肥卡,這樣就會賦予框架事件監(jiān)聽和事件觸發(fā)的能力
所以,在app.js 中引用koa時昙读,變量Koa就是指向該Application類
2召调、接著我們會在app上使用use掛載中間件函數(shù)和listen監(jiān)聽響應(yīng)
需要搞清楚的問題有兩個:
app.use 的作用是掛載中間件膨桥,它做了什么蛮浑?
app.listen 的作用是監(jiān)聽端口唠叛,它做了哪些工作?
在use方法中沮稚,首先判斷穿參是否為函數(shù)艺沼,否則拋出錯誤;判斷是否為generator函數(shù)蕴掏,給出log表示generator 用法已被棄用障般,并且通過convert函數(shù)進(jìn)行轉(zhuǎn)換處理
找到convert函數(shù),如下
在Koa的v1版本和v0版本盛杰,異步控制方案是Generator+Promise+Co挽荡,中間件定義Generator Function。Koa v2版本即供,異步控制方案支持Async/Await定拟,中間件用普通函數(shù)也可以
掛載之后,看下監(jiān)聽listen:
3逗嫡、中間件執(zhí)行const?fn = compose(this.middleware);
compose小可愛出現(xiàn)了...
4青自、整體分析過程