從零組裝新工具 - Koa2

原由

做爲一個前端,Node.js算是必備知識之一。同時由於本身須要作一些後臺性的工做,或者完成一個小型應用。因此學習了Node的Express框架,用於輔助和加速開發。javascript

不過當初本身對Express的學習和了解,並非很深刻。要求也僅僅是停留在能發送靜態文件,構建後臺API,與數據庫完成簡單交互而已。因此當初本身選用Express時,靠的是Express 應用生成器,至關於Express的最佳實踐。
在使用了一段時間以後,被Express的「回調地獄」,「自定義程度不高」等問題所困擾,因而決定更換至新的框架。html

在選擇框架時,遵循了本身學習新技術的原則:前端

要麼找值得學習的,深刻學習並理解。要麼找適合當前業務,能快速解決問題的。不要在具體某某某個技術上糾結過久。java

這句話也是本身看餘果大大的《Web全棧工程師的自我修養》這本書的體會。git

選擇Koa

在上面原則的指導下,很容易的就找到了一款符合本身需求的框架:Koa。
Koa由於應用了ES6的生成器語法,因此很是優雅的解決了Node.js的回調地獄問題。
好比說這樣的Ajax代碼,看起來就比回調函數的寫法優雅不少。es6

function* main() {
  var result = yield request("http://some.url");
  var resp = JSON.parse(result);
  console.log(resp.value);
}

function request(url) {
  makeAjaxCall(url, function(response){
    it.next(response);
  });
}

例子來源: Generator 函數github

雖然yield的寫法有點奇怪,但仍是能夠接受的。數據庫

選擇Koa2

同時在Koa的github首頁中,看到了Koa2。
Koa2應用了ES7的Async/Await來替代Koa1中的生成器函數與yield。
因此上一段代碼的main函數,在Koa2里長這樣:express

async function main() {
  var result = await request("http://some.url");
  var resp = JSON.parse(result);
  console.log(resp.value);
}

使用了Async/Await後,整段代碼是變的更加好看的。npm

理解Koa的中間件

在一開始學習Koa時,是不太理解Koa的中間件級聯這個概念的。
就是下圖這玩意。
中間件級聯

這個算是Koa的核心概念了,不理解這個,只能安安心心繼續用Express。

還好本身平時愛去看各類開發大會的視頻,來提高本身的眼界。因此昨晚正好在慕課網看到了《阿里D2前端技術論壇——2015融合》的大會視頻,便開心的點開學習。
而第一篇《用 Node.js 構建海量頁面渲染服務——by 不四》講的就有Koa框架,還梳理了Koa的中間件級聯這個概念。
在不四前輩介紹完Koa的中間件級聯後,我發現本身好像理解了。
配合着本身以前學習的ES6知識,才發現原來是這樣。
在這兒我貼一段代碼和本身的理解,有興趣的同窗能夠看一看。

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

// x-response-time

app.use(function *(next){
  // 首先啓動第一個中間件,記錄下時間
  var start = new Date;
  // 進入中間件,並等待返回。
  yield next;
  // 返回後,表明操做已完成,記錄結束時間並輸出。
  var ms = new Date - start;
  this.set('X-Response-Time', ms + 'ms');
});

// response
app.use(function *(){
  // 最後一箇中間件,將body寫成'Hello World'
  this.body = 'Hello World';
});

app.listen(3000);

整個的流程,會是這樣的:

.middleware1 {
  // (1) do some stuff
  .middleware2 {
    // (2) do some other stuff
    .middleware3 {
      // (3) NO next yield !
      // this.body = 'hello world'
    }
    // (4) do some other stuff later
  }
  // (5) do some stuff lastest and return
}

至此,學習Koa的最後一個難關,也被攻克了。

從零組裝Koa

由於對Express的學習和使用,知道了本身對於後臺框架的真實需求。
因此這回決定不用Koa generator以內的工具,而是本身從零開始,組裝一個適合本身的Koa框架。
基於Koa2,使用Async/Await,符合本身需求……
想一想就是很美好的事情呀。

梳理需求

首先要作的,天然就是梳理本身的需求。看看到底須要什麼東西。
因而翻出本身前兩個月在使用的Express框架,肯定了如下要點。

  1. 路由,建立Rest Api

  2. 發送靜態HTML文件

  3. 設置靜態文件目錄

  4. 發送和讀取JSON數據

  5. 渲染模板

  6. 使用ES6語法完成工做

實現需求

具體的實現部分,這兒就再也不贅述了。就是去github和npm上,尋找一個一個的包並組裝在一塊兒了而已。
整個項目的亮點就在於:徹底符合我的需求,而且使用ES6來完成工做。對我我的而言,用ES6不只看起來爽,也能提高個人工做效率。

整個項目已開源於Github,往後本身取用也很是方便。有興趣的同窗,也能夠嘗試一下。
項目地址:koa2-easy

總結

這周由於胃腸炎,好像也沒作啥事情……最大的事兒也只是組裝了個Koa框架。
由於養病的緣由,只能天天看看開發者大會的視頻。由於肚子時不時的抽一下,真的很影響工做啊……

今天感受好了一點,但願病情早日康復~就醬~

相關文章
相關標籤/搜索