koa加載解析記錄

> 因項(xiàng)目需要使用koa模擬服務(wù)器返回接口涝焙,研究下koa加載過(guò)程

1卑笨、nodejs下的require, 一切node模塊的加載都是從node_modules開(kāi)始的,打開(kāi)koa模塊package.json 仑撞,僅關(guān)注入口main屬性對(duì)應(yīng)的啟動(dòng)項(xiàng)湾趾,和dependencies 屬性的依賴項(xiàng),npm模塊的依賴會(huì)檢查如果dependencies下對(duì)應(yīng)的文件是否存在派草,如果不存在則加載搀缠,參考樸靈深入淺出nodejs

 {
  "main": "lib/application.js",
  "dependencies": {
    "accepts": "^1.3.5",
    "cache-content-type": "^1.0.0",
    "content-disposition": "~0.5.2",
    "content-type": "^1.0.4",
    "cookies": "~0.7.1",
    "debug": "^3.1.0",
    "delegates": "^1.0.0",
    "depd": "^1.1.2",
    "destroy": "^1.0.4",
    "error-inject": "^1.0.0",
    "escape-html": "^1.0.3",
    "fresh": "~0.5.2",
    "http-assert": "^1.3.0",
    "http-errors": "^1.6.3",
    "is-generator-function": "^1.0.7",
    "koa-compose": "^4.1.0",
    "koa-convert": "^1.2.0",
    "koa-is-json": "^1.0.0",
    "on-finished": "^2.3.0",
    "only": "~0.0.2",
    "parseurl": "^1.3.2",
    "statuses": "^1.5.0",
    "type-is": "^1.6.16",
    "vary": "^1.1.2"
  },
  "devDependencies": {
    "eslint": "^3.17.1",
    "eslint-config-koa": "^2.0.0",
    "eslint-config-standard": "^7.0.1",
    "eslint-plugin-promise": "^3.5.0",
    "eslint-plugin-standard": "^2.1.1",
    "jest": "^20.0.0",
    "supertest": "^3.1.0"
  }
}

2、app.use 中間件, 其實(shí)就是做了個(gè)記錄近迁,把傳入會(huì)掉push到middleware艺普,callback函數(shù)會(huì)在http.createServer中以高階函數(shù)的形式返回,注入ctx和之前push到middleware中的回調(diào)。所以當(dāng)改變url觸發(fā)了http.createServer 歧譬,會(huì)執(zhí)行use中的函數(shù)岸浑。

//中間件  
use(fn) {
    if (typeof fn !== 'function') throw new TypeError('middleware must be a function!');
    if (isGeneratorFunction(fn)) {
      deprecate('Support for generators will be removed in v3. ' +
                'See the documentation for examples of how to convert old middleware ' +
                'https://github.com/koajs/koa/blob/master/docs/migration.md');
      fn = convert(fn);
    }
    debug('use %s', fn._name || fn.name || '-');
    this.middleware.push(fn);
    return this;
  }
//監(jiān)聽(tīng)
  listen(...args) {
    debug('listen');
    const server = http.createServer(this.callback());
    return server.listen(...args);
  }
//監(jiān)聽(tīng)回調(diào)
 callback() {
    const fn = compose(this.middleware);

    if (!this.listenerCount('error')) this.on('error', this.onerror);

    const handleRequest = (req, res) => {
      const ctx = this.createContext(req, res);
      return this.handleRequest(ctx, fn);
    };

    return handleRequest;
  }

3、自己開(kāi)發(fā)use

//class router
let data = {}
class router {
  
  constructor(str,fun){
    Object.defineProperty(router,"data",{value:{}})
  }
   get(str,fun){
    router.data[str] = fun;
   }
   async main(params,next){  
        await next();
       let reg = /\/.*/g;
       let {path} = params;
       router.data[path](params);
    }

}
module.exports=new router;

//執(zhí)行

const Koa = require('koa');
const app = new Koa();
const router = require("./router");
router.get("/getData",async arg=>{
    
    arg.body="hello world"
})
app.use(router.main); //響應(yīng)
app.listen(3000);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瑰步,一起剝皮案震驚了整個(gè)濱河市矢洲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缩焦,老刑警劉巖读虏,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異袁滥,居然都是意外死亡盖桥,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門题翻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)揩徊,“玉大人,你說(shuō)我怎么就攤上這事嵌赠∷芑模” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵姜挺,是天一觀的道長(zhǎng)袜炕。 經(jīng)常有香客問(wèn)我,道長(zhǎng)初家,這世上最難降的妖魔是什么偎窘? 我笑而不...
    開(kāi)封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮溜在,結(jié)果婚禮上陌知,老公的妹妹穿的比我還像新娘。我一直安慰自己掖肋,他們只是感情好仆葡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著志笼,像睡著了一般沿盅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纫溃,一...
    開(kāi)封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天腰涧,我揣著相機(jī)與錄音,去河邊找鬼紊浩。 笑死窖铡,一個(gè)胖子當(dāng)著我的面吹牛疗锐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播费彼,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼滑臊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了箍铲?” 一聲冷哼從身側(cè)響起雇卷,我...
    開(kāi)封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颠猴,沒(méi)想到半個(gè)月后关划,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芙粱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氧映。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片春畔。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖岛都,靈堂內(nèi)的尸體忽然破棺而出律姨,到底是詐尸還是另有隱情,我是刑警寧澤臼疫,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布择份,位于F島的核電站,受9級(jí)特大地震影響烫堤,放射性物質(zhì)發(fā)生泄漏荣赶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一鸽斟、第九天 我趴在偏房一處隱蔽的房頂上張望拔创。 院中可真熱鬧,春花似錦富蓄、人聲如沸剩燥。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)灭红。三九已至,卻和暖如春口注,著一層夾襖步出監(jiān)牢的瞬間变擒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工寝志, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赁项,地道東北人葛躏。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像悠菜,于是被迫代替她去往敵國(guó)和親舰攒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,125評(píng)論 0 3
  • 個(gè)人入門學(xué)習(xí)用筆記悔醋、不過(guò)多作為參考依據(jù)摩窃。如有錯(cuò)誤歡迎斧正 目錄 簡(jiǎn)書好像不支持錨點(diǎn)、復(fù)制搜索(反正也是寫給我自己看...
    kirito_song閱讀 2,458評(píng)論 1 37
  • 謹(jǐn)記 什么是價(jià)值?或許沒(méi)有多少人能夠明白账阻,其實(shí)價(jià)值并不是實(shí)際存在的蒂秘,它應(yīng)該是一種體現(xiàn),比如為城市點(diǎn)綴最美好的一面而...
    長(zhǎng)風(fēng)留言閱讀 2,446評(píng)論 0 15
  • 人心淘太,是不待風(fēng)吹自搖擺的花姻僧,假期來(lái)臨,有按捺不住的律動(dòng)蒲牧! 工作有壓力撇贺,勞動(dòng)有要求,偷得浮生三日閑冰抢,豈能...
    所謂伊人J閱讀 395評(píng)論 1 1
  • 是不是傷感都來(lái)自九月 帶著委婉 醒目 的細(xì)節(jié) 搭配上突如其來(lái) 一場(chǎng)雪 面目猙獰 血腥孤劣 再加入哥特式 尖...
    Jaa_閱讀 194評(píng)論 1 2