先看看這個極簡的啟動**:
const koa = require('koa');
// response
ctx.body = 'hello koa';
});
我們在koa原始碼資料夾下建立index.js檔案, 將上面的**寫入,並將require('koa')
換成require('.')
const koa = require('.')
debugger
ctx.body = 'hello koa';
});複製**
然後進入目錄執行node --inspect-brk index.js
在chrome瀏覽器開啟除錯chrome://inspect
1.引入koa
require 會依照這個順序去查詢需要的檔案
module._extensions=複製**
通過讀取package.json中的main欄位得到完整路徑
查詢到路徑之後通過 fs.readfilesync載入模組
讀取檔案後開始編譯,首先將讀取的**script,進行組裝,
即頭部新增(function (exports, require, module, __filename, __dirname) );'
nativemodule.wrap = function(script) ;
'(function (exports, require, module, __filename, __dirname) );'
];複製**
這就是為什麼每個模組沒有定義exports, require, module, __filename, __dirname變數,卻能使用的原因
constructor()
首先new koa()
的時候就是new的這個物件, 最關鍵的是建立了context,request,response物件
constructor
() 複製**
use()
通過該方法引入中介軟體,中介軟體可以是乙個普通的函式, 可以是乙個generator, 可以是async函式,如果是generator那麼koa會幫你轉成基於promise的函式。根據use使用的先後順序, middleware陣列中會儲存所有的中介軟體。
use(fn)
this.middleware.push(fn);
return this;
}複製**
listen()
listen函式表面上看是用於監聽某個埠,實際上包裹了真正的nodejs提供的http server, createserver函式接受乙個處理請求的函式,由callback()返回
listen(...args)
複製**
callback()
callback
() ;
return handlerequest;
}複製**
createcontext()
這個函式與其說是建立context物件,不如說是將koa的各個內部物件連線在一起。並設定cookies和accepts.
// req, res 是node的原生請求響應物件,是所有資訊的**.
// request,response是koa提供的方便我們開發使用的請求響應物件.
createcontext(req, res) );
// 更常用的從ip中讀取請求方的ip位址, ips是?
request.ip = request.ips[0] || req.socket.remoteaddress || '';
// 使用accepts設定請求能接受的內容型別
context.accept = request.accept = accepts(req);
// ?
context.state = {};
return context;
}複製**
respond()
當我們完成處理需要返回時我們設定this.body = '***'
然後函式返回,不需要我們手動呼叫res.end(),因為koa已經幫我們封裝好了.
/**
* response helper.
*/function respond(ctx)
if ('head' === ctx.method)
return res.end();
} // 如果沒有設定body,只設定了status,則用狀態碼或message設定body.
if (null == body)
return res.end(body);
}
// koa 支援buffer, string, stream型別的資料
if (buffer.isbuffer(body)) return res.end(body);
if ('string' === typeof body) return res.end(body);
if (body instanceof stream) return body.pipe(res);
// body: json 處理普通json型別返回.
body = json.stringify(body);
if (!res.headerssent)
res.end(body);
}複製**
context是整個請求的上下文,其最特殊的地方其實是整合response和request,讓你在應用的任何地方通過context獲得應用相關的任何資訊
響應體相關的方法屬性
Koa原始碼分析
上篇文章寫了如何閱讀koa的原始碼,粗略的過了一下koa的原始碼,但是作為乙個沒有得出乙個具體的結論,中介軟體的執行原理也不清楚,這裡我們再仔細的過一遍koa的原始碼.首先還是先過一遍例子 const koa require koa ctx.body hello world 複製 起乙個web服務,...
koa 原始碼分析
koa的用法,這裡就不在列舉了。我覺得koa主要功能主要是下面幾個方面 1 提供了中介軟體機制 2 封裝了request response,context物件 3 使用了yield,提供了便利的流程控制,使非同步程式設計更優雅 4 便捷的異常處理,使用try catch就可以捕獲程式中的異常,不需要...
Koa 原始碼分析
閱讀原始碼可以很好地提高自身水平,從 會用 到 掌握原理 的過程,也是自身從前端菜鳥到中高階高階的過程,在不少面試過程中,也會問到你有沒有閱讀過原始碼等問題。該場 chat 將會為大家分享一下看似很複雜,其實超級簡單的 node.js koa 框架。主要會分享以下內容 koa 封裝原生 http 模...