4.1 koa的由來(lái)

本節(jié)我們將簡(jiǎn)單介紹一下 koa扇谣。

nodejs是什么蹈胡?

Node.js是一個(gè)創(chuàng)建于 2009年的Javascript運(yùn)行環(huán)境通熄。它使用了一個(gè)事件驅(qū)動(dòng)、非阻塞式 I/O 的模型脱羡,基于回調(diào)實(shí)現(xiàn)的異步編程萝究,使其輕量又高效。

例如锉罐,我們可以一邊讀取文件帆竹,一邊執(zhí)行其他命令,在文件讀取完成后氓鄙,我們將文件內(nèi)容作為回調(diào)函數(shù)的參數(shù)返回馆揉。這樣在執(zhí)行代碼時(shí)就沒(méi)有阻塞或等待文件 I/O 操作。

這就大大提高了 Node.js 的性能抖拦,可以處理大量的并發(fā)請(qǐng)求升酣,因此舷暮,Node 主要用在開(kāi)發(fā) Web 應(yīng)用。

使用原生nodejs提供web服務(wù)

要在nodejs中提供web服務(wù)噩茄,我們需要引入 nodejs 的Http模塊:require('http'), 然后調(diào)用createServer方法下面,傳入一個(gè)函數(shù)作為參數(shù)即可:

const Server = http.createServer((req, res) => {
  res.writeHead(200,{'Content-Type': 'application/json;charset=utf-8;'});
  res.write('{text: "寫(xiě)代碼很快樂(lè)啊!"}');
  res.end();
}).listen(8888);

可以看到绩聘,代碼可讀性不是很好沥割,開(kāi)發(fā)也不是很便利,于是就有了 Express 這個(gè)第一代最流行的web框架凿菩。

express 框架

我們看看机杜,使用express, 怎么實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的入門(mén)網(wǎng)站:

var express = require('express');
var app = express();
app.get('/', function (req, res) {
    res.send('寫(xiě)代碼很快樂(lè)!');
});
app.listen(8888);

可以看到衅谷,代碼精簡(jiǎn)了很多椒拗,雖然express的API很簡(jiǎn)單,但是它是基于ES5的語(yǔ)法获黔,要實(shí)現(xiàn)異步代碼蚀苛,只有一個(gè)方法:回調(diào)。如果異步嵌套層次過(guò)多玷氏,代碼寫(xiě)起來(lái)就非常難看堵未,比如讀取一個(gè)文件成功后再讀取一個(gè)文件:

app.get('/file', function (req, res) {
    fs.readFile('/file1', function (err, data) {
        if (err) { res.status(500).send('讀取文件1失敗'); }
        fs.readFile('/file2', function (err, data) {
            if (err) {  res.status(500).send('讀取文件2失敗'); }
            res.type('text/plain');
            res.send(data);
        });
    });
});

雖然可以用async這樣的庫(kù)來(lái)組織異步代碼,但是用回調(diào)寫(xiě)異步實(shí)在是太痛苦了盏触,特別是異步嵌套多的時(shí)候渗蟹,這就是JS遠(yuǎn)古時(shí)期的 回調(diào)地獄!

koa 1.x的到來(lái)

隨著ES6在新版Node.js獲得支持ES6赞辩,express的團(tuán)隊(duì)基于ES6的generator推出了koa這個(gè) web 框架拙徽。和express相比,koa 1.0使用generator實(shí)現(xiàn)異步诗宣,比如實(shí)現(xiàn)上面同樣的功能,代碼如下:

var koa = require('koa');
var app = koa();

app.use('/file', function *() {
    yield readFile1();
    var data = yield readFile2();
    this.body = data;
});
app.listen(8888);

可以看到想诅,用generator實(shí)現(xiàn)異步比回調(diào)簡(jiǎn)單了不少召庞,但是generator的本意并不是異步。Promise才是為異步設(shè)計(jì)的来破,但是Promise的寫(xiě)法很復(fù)雜篮灼。為了簡(jiǎn)化異步代碼,ES7引入了新的關(guān)鍵字async和await徘禁,可以輕松地把一個(gè)function變?yōu)楫惒侥J剑?/p>

async function () {
    var data = await fs.read('/file1');
}

最新的koa 2.x的到來(lái)

koa團(tuán)隊(duì)并沒(méi)有止步于koa 1.0诅诱,他們非常超前地基于ES7開(kāi)發(fā)了koa2,和koa 1相比送朱,koa2完全使用Promise并配合async來(lái)實(shí)現(xiàn)異步娘荡。

app.use(async (ctx, next) => {
    await next();
    var data = await readFile();
    ctx.response.type = 'text/plain';
    ctx.response.body = data;
});

通過(guò)以上分享干旁,大家可以看到,我們項(xiàng)目使用koa2炮沐,是按照node->express->koa1-<koa2 一步步隨著新的JS規(guī)范通過(guò)并獲得支持的發(fā)展而來(lái)的争群,出現(xiàn)的主要原因就是為了在node開(kāi)發(fā)中優(yōu)雅的寫(xiě)異步代碼。

express, koa1和koa2的區(qū)別

koa vs express

  • 相同點(diǎn)

    • 構(gòu)建 web 應(yīng)用的 node 框架
    • 總體來(lái)看語(yǔ)法差別不大大年,比如都是引入后框架后實(shí)例后换薄,中間件處理以及監(jiān)聽(tīng)端口;
    • 都是同一個(gè)團(tuán)隊(duì)開(kāi)發(fā)維護(hù)的
  • 區(qū)別

    • express: 框架內(nèi)容更豐富翔试,有更大的社區(qū)轻要,歷史更悠久,文檔更豐富垦缅,用戶(hù)群更大冲泥,支持 jade 等前端模板語(yǔ)言,express沒(méi)有統(tǒng)一的錯(cuò)誤處理失都,而koa有默認(rèn)的錯(cuò)誤處理方式柏蘑。
    • koa: 更小、更富有表現(xiàn)力粹庞、更健壯咳焚,Koa 支持 es6 語(yǔ)法,Koa 在內(nèi)核方法中不綁定任何中間件庞溜,不提供路由功能和某些工具革半,摒棄了的回調(diào),采用 generator 或 promise的方式流码,在 Context中又官,Koa 對(duì) request 和 response 進(jìn)行了封裝,使用方式也相應(yīng)改變漫试,如返回簡(jiǎn)單內(nèi)容六敬,在koa: this.body = ‘hello world’,而在express: res.send(‘hello world’)驾荣。

koa1 vs koa2

  • 中間件的使用: koa1依賴(lài) co 并采用 generator 函數(shù)外构,在函數(shù)內(nèi)使用 yield 語(yǔ)句,而koa2增加了箭頭函數(shù)播掷,移除了 co 依賴(lài)审编,使用 Promise,因此可以結(jié)合 async歧匈,await 使用垒酬;
  • context 對(duì)象的獲取:koa1為this 對(duì)象,this.req, this.res勘究;koa2: cxt 參數(shù)矮湘,cxt.req, cxt.res。

了解了koa的背景知識(shí)后乱顾,下一節(jié)我們將簡(jiǎn)單分析其源碼啦板祝!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市走净,隨后出現(xiàn)的幾起案子券时,更是在濱河造成了極大的恐慌,老刑警劉巖伏伯,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橘洞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡说搅,警方通過(guò)查閱死者的電腦和手機(jī)炸枣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)弄唧,“玉大人适肠,你說(shuō)我怎么就攤上這事『蛞” “怎么了侯养?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)澄干。 經(jīng)常有香客問(wèn)我逛揩,道長(zhǎng),這世上最難降的妖魔是什么麸俘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任辩稽,我火速辦了婚禮,結(jié)果婚禮上从媚,老公的妹妹穿的比我還像新娘逞泄。我一直安慰自己,他們只是感情好拜效,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布炭懊。 她就那樣靜靜地躺著,像睡著了一般拂檩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘲碧,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天稻励,我揣著相機(jī)與錄音,去河邊找鬼。 笑死望抽,一個(gè)胖子當(dāng)著我的面吹牛加矛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播煤篙,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼斟览,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了辑奈?” 一聲冷哼從身側(cè)響起苛茂,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸠窗,沒(méi)想到半個(gè)月后妓羊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稍计,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年躁绸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臣嚣。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡净刮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出硅则,到底是詐尸還是另有隱情淹父,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布抢埋,位于F島的核電站弹灭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏揪垄。R本人自食惡果不足惜穷吮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饥努。 院中可真熱鬧捡鱼,春花似錦、人聲如沸酷愧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)溶浴。三九已至乍迄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間士败,已是汗流浹背闯两。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工褥伴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漾狼。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓重慢,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親逊躁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子似踱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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

  • 前言 跟好朋友打賭,我要來(lái)個(gè)技術(shù)文章日更绿店。于是吉懊,我跑到到群里喊了句,我要日更假勿。沒(méi)想到借嗽,得到的是大家的支持與鼓勵(lì)。感...
    白昔月閱讀 25,638評(píng)論 26 108
  • 前言 Koa 是運(yùn)行在 Node.js 中的 web 服務(wù)框架转培,小而美恶导。 Koa2 是 Koa 框架的最新版本,K...
    let_Scott閱讀 5,774評(píng)論 2 28
  • 第四期進(jìn)階班打卡已經(jīng)進(jìn)行5天了浸须,沒(méi)想到這期打卡的內(nèi)容進(jìn)行了迭代更新惨寿,這一期的打卡內(nèi)容是我參加語(yǔ)言美學(xué)以來(lái)體驗(yàn)最好的...
    微笑你好閱讀 184評(píng)論 0 0
  • 花開(kāi)了,在一個(gè)美麗的晨曦中删窒, 草綠了裂垦,在一個(gè)昏暗的夜晚里。 花說(shuō)‘‘你看我多么嬌艷!’’ 草笑而不答肌索。 蜜蜂來(lái)了蕉拢,...
    夏茗墨閱讀 340評(píng)論 1 1
  • 什么是動(dòng)詞,什么是形容詞诚亚,什么是名詞晕换?怎樣記住原始詞,怎么以一個(gè)實(shí)例來(lái)記住變形以及變形后的詞義 音譯法 拼音法 字...