Koa 仍是 Express

先放一些別人寫的node

我也來湊個熱鬧git

羣裏不少人在問到底該用Koa仍是express,本文會對比2個框架的各類細節,並給出指導意見,但願可以爲你們解惑。es6

koa

koa 是由 Express 原班人馬打造的,致力於成爲一個更小、更富有表現力、更健壯的 Web 框架。使用 koa 編寫 web 應用,經過組合不一樣的 generator,能夠免除重複繁瑣的回調函數嵌套,並極大地提高錯誤處理的效率。koa 不在內核方法中綁定任何中間件,它僅僅提供了一個輕量優雅的函數庫,使得編寫 Web 應用變得駕輕就熟。github

版本要求

Koa 目前須要 >=0.11.x版本的 node 環境。並須要在執行 node 的時候附帶 --harmony 來引入 generators 。web

express無所謂,目前0.10+都ok,甚至更低版本express

中間件變化

Koa 應用是一個包含一系列中間件 generator 函數的對象。 這些中間件函數基於 request 請求以一個相似於棧的結構組成並依次執行。 Koa 相似於其餘中間件系統(好比 Ruby’s Rack 、Connect 等), 然而 Koa 的核心設計思路是爲中間件層提供高級語法糖封裝,以加強其互用性和健壯性,並使得編寫中間件變得至關有趣。api

Koa 包含了像 content-negotiation(內容協商)、cache freshness(緩存刷新)、proxy support(代理支持)和 redirection(重定向)等經常使用任務方法。 與提供龐大的函數支持不一樣,Koa只包含很小的一部分,由於Koa並不綁定任何中間件。緩存

和 express 基於的中間件Connect,差異並不大,思想都是同樣的,它裏面說的服務器

加強其互用性和健壯性

我還沒玩出太多感想,請你們指點cookie

除了yield next;外,並沒有其餘

yield要說一下,必須在處理的中間件裏纔會回調

好比

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

//1 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');
});

//2 logger

app.use(function *(next){
  var start = new Date;
  yield next;
  var ms = new Date - start;
  console.log('%s %s - %s', this.method, this.url, ms);
});

//3 response

app.use(function *(){
  this.body = 'Hello World';
});

app.listen(3000);

在程序啓動的時候,1和2是沒有執行的,只有當執行到任意請求,好比3的時候,它纔會調用1和2

錯誤處理

koa

app.on('error', function(err){
  log.error('server error', err);
});

而在新版的express裏

server.on('error', onError);


/**
 * Event listener for HTTP server "error" event.
 */

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

兩者實際上沒有啥大差異

Koa Context

將 node 的 request 和 response 對象封裝在一個單獨的對象裏面,其爲編寫 web 應用和 API 提供了不少有用的方法。

這些操做在 HTTP 服務器開發中常用,所以其被添加在上下文這一層,而不是更高層框架中,所以將迫使中間件須要從新實現這些經常使用方法。

context 在每一個 request 請求中被建立,在中間件中做爲接收器(receiver)來引用,或者經過 this 標識符來引用:

app.use(function *(){
  this; // is the Context
  this.request; // is a koa Request
  this.response; // is a koa Response
});

比express裏爽一些,express裏中間件可變參數仍是會比較噁心,並且性能也很差

對比一些api

  • req
  • res

基本上如出一轍

兩者比較總結

https://github.com/koajs/koa/blob/master/docs/koa-vs-express.md

Feature Koa Express Connect
Middleware Kernel
Routing    
Templating    
Sending Files    
JSONP    

Does Koa replace Express?

It’s more like Connect, but a lot of the Express goodies were moved to the middleware level in Koa to help form a stronger foundation. This makes middleware more enjoyable and less error-prone to write, for the entire stack, not just the end application code.

Typically many middleware would re-implement similar features, or even worse incorrectly implement them, when features like signed cookie secrets among others are typically application-specific, not middleware specific.

拿koa來比較express並不太合適,能夠說它是介於connect和express中間的框架

  • 與connect相似都是調用棧思想,但修改了中間件模式,使用generator
  • 把express裏的一些好的東西加進去,但剔除了路由,視圖渲染等特性

總結

koa是一個比express更精簡,使用node新特性的中間件框架,相比以前express就是一個龐大的框架

  • 若是你喜歡diy,很潮,能夠考慮koa,它有足夠的擴展和中間件,並且本身寫很簡單
  • 若是你想簡單點,找一個框架啥都有,那麼先express

koa是大勢所趨,我很想用,但我目前沒有選koa,個人考慮

  • node 0.11+我目前沒有搞定node-inspector,因此我啥時候搞定,啥時候遷移
  • 團隊成本問題,若是他們連express都不會,上來就koa,學習曲線太陡,不合適
  • 目前基於express的快讀開發框架須要一段時間遷移到koa

和es6的考慮是同樣的,又愛又恨,先作技術儲備,只要時機ok,堅決果斷的搞起。

目前express由strongloop負責,它的下一步如何發展,還說很差,好比5.0、6.0是否會用koa做爲中間件也很差說

koa代碼不多,能夠很容易讀完

https://github.com/koajs/koa

另外值得提得一點是,核心開發者 @dead-horse 是阿里的員工,贊一下國內的開源。

12月份我寫了一個koa-generator,可讓不少習慣express的人遷移過來,見文章https://cnodejs.org/topic/56650091e7cd33da066d6ee7

相關文章
相關標籤/搜索