1. 程式人生 > >Koa2實用入門

Koa2實用入門

hello lean middle 不用 解決方案 將在 method function star

koa2已發布了一段時間,可以考慮入手,參見Node.js最新Web技術棧(2016年4月)

本文主要是koa 2的文檔解讀和runkoa介紹,讓大家對koa 2有一個更簡單直接的理解

一.依賴Node.js 4.0+

Koa requires node v4.0.0 or higher for (partial) ES2015 support.

部分特性需要ES2015,大家可以自己比對一下es6在node不同版本裏的支持特性

http://kangax.github.io/compat-table/es6/

二.hello world

const Koa = require(‘koa‘);
const app 
= new Koa(); // 此處開始堆疊各種中間件 //... app.use(ctx => { ctx.body = ‘Hello Koa‘; }); app.listen(3000);

  註意註釋部分,此處開始堆疊各種中間件

三.中間件:Middleware

  Koa 是一個 middleware framework, 它提供了 3 種不同類型的中間件寫法

  a.common function
  b.async function(新增)
  c.generatorFunction
  中間件和express的中間件類似,是有順序的,註意,大部分人都坑死在順序上

  下面以寫一個logger中間件為例,一一闡明

四.最常見的寫法

  node sdk就支持的,就是最常見的

app.js

const Koa = require(‘koa‘);
const app = new Koa();

app.use((ctx, next) => {
  const start = new Date();
  return next().then(() => {
    const ms = new Date() - start;
    console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
  });
});


// response
app.use(ctx => {
  ctx.body 
= ‘Hello Koa in app.js‘; }); app.listen(3000);

五.async/await 函數 (Babel required)

  async/await是異步流程控制更好的解決方案,很多潮人都已經玩起來了,目前node sdk不支持,所以需要babel來轉換一下

app-async.js

const Koa = require(‘koa‘);
const app = new Koa();

app.use(async (ctx, next) => {
  const start = new Date();
  await next();
  const ms = new Date() - start;
  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});

// response
app.use(ctx => {
  ctx.body = ‘Hello Koa in app-async.js‘;
});

app.listen(3000);

六.Generator函數

  Generator是node 4(嚴格是0.12)開始支持的es6特性裏的非常重要的一個,用generator和promise實現流程控制,讓co充當執行器這一個角色,也是個不錯的解決方案

千萬別把generator叫成生成器,我們一般習慣把scaffold叫成生成器。

app-generator.js

const Koa = require(‘koa‘);
const app = new Koa();
const co = require(‘co‘);

app.use(co.wrap(function *(ctx, next) {
  const start = new Date();
  yield next();
  const ms = new Date() - start;
  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
}));

// response
app.use(ctx => {
  ctx.body = ‘Hello Koa  in app-generator.js‘;
});

app.listen(3000);

七.測試

  啟動執行

npm i -g runkoa

runkoa app.js
runkoa app-async.js     
runkoa app-generator.js 

  測試發起http請求

$ curl http://127.0.0.1:3000
Hello Koa in app.js

八.v3將移除單純的以generator作為中間件的寫法

  Old signature middleware (v1.x) support will be removed in v3
  實際是koa核心包含了一個叫koa-convert的模塊,它裏面warning說,以generator作為中間件的寫法將在koa@3裏不支持

  但是用co或koa-convert轉過的還是可以的,本文的3種寫法都是長期支持的

  如下這樣寫不行:

const Koa = require(‘koa‘);
const app = new Koa();
const co = require(‘co‘);

const convert = require(‘koa-convert‘);

app.use(convert(function *(next) {
  const start = new Date();
  yield next;
  const ms = new Date() - start;
  console.log(`${this.method} ${this.url} - ${ms}ms`);
}));

// response
app.use(ctx => {
  ctx.body = ‘Hello Koa  in app-convert.js‘;
});

app.listen(3000);

  這樣寫是可以的

const Koa = require(‘koa‘);
const app = new Koa();
const co = require(‘co‘);

// Koa will convert
app.use(function *(next) {
  const start = new Date();
  yield next;
  const ms = new Date() - start;
  console.log(`${this.method} ${this.url} - ${ms}ms`);
});

// response
app.use(ctx => {
  ctx.body = ‘Hello Koa  in app-noconvert.js‘;
});

app.listen(3000);

九.Babel支持

  我本人比較討厭寫babel,對於node sdk不支持的特性持觀望態度,比如async/await這樣的神器是可以用的,其他的是不一定一定要上的,那就觀望好了

  如果在koa 2裏用到async/await就需要babel支持了

  a.es2015-node5(nodejs 5.x裏支持的es6特性)
  b.stage-3(包含async/await)
  可是,我還是不想用,就幾行代碼能搞定的事兒,我不想看到babel出現在我的代碼裏,於是就有了前面用到的runkoa,它的原理也是這樣的,不過看起來更clean一些

十.總結

  Node.js 4.x和5.x支持的es特性還是有很大差異的,如果不用到,還好,萬一用到就只能babel去轉換,還有就是async支持,必須要stage-3,那麽也還是需要babel。

  Node.js sdk遲遲不更新很討厭,babel更新太快也很討厭
  但是,無論從性能,還是流程控制上,koa 2和它的後宮(中間件)都是非常好的解決方案

文章來源:https://cnodejs.org/topic/5709959abc564eaf3c6a48c8

Koa2實用入門