Giới thiệu Koa.js

Về Node.js, ắt hẳn mọi người đều đã quá quen với Expressjs. Nên nay tôi giới thiệu một framework mới cũng khá hay, hiệu năng cao và dễ sử dụng - Koajs - next generation web framework for node.js

Koa.js là gì?

Koa là một Web framework Nodejs, được viết bởi team của Expressjs. Koa sử dụng nhiều chức năng mới của ES6, được xem là chưa ổn định với các bản Nodejs dưới 4.0, nhưng mới vừa rồi Node v6 vừa ra mắt, đánh dấu Koajs sẽ là 1 framework mạnh và ổn định hơn.

Koa.js yêu cầu sử dụng Node.js v4.0 trở lên, với các bản 4.0 trở về trước yêu cầu sử dụng thêm flag --harmony để kích hoạt các chức năng mở rộng của Javascript (cụ thể là generator).

node --harmony app.js

Vì sao nên sử dụng Koa

Như đã PR, koa is next generation web framework. Koa chủ yếu tận dụng chức năng generators của Javascript ES6. Bạn có thể xem bài viết sau để hiểu rõ hơn về Generators này: function* và yield trong Javascript generator function

Ngoài ra còn 2 chức năng mới nữa là sử dụng middleware theo từng tầng và xử lý lỗi tốt. Một điểm tôi thấy hay khi sử dụng nữa là Koa có phong cách code rất lite, giúp app nhỏ gọn và dễ kiểm soát.

Hello world

Cài đặt koa bằng npm

$ npm install koa

Tạo và mở file app.js với nội dung:

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

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

app.listen(3000);

Khởi động Web server bằng lệnh:

$ node app.js

Truy cập trình duyệt bằng địa chỉ: http://localhost:3000

yielding to *

Koa được viết dựa trên co - giúp xử lý generators, thay vì sử dụng callback, Koa nhờ đó có cú pháp đơn giản và sạch sẽ hơn. Bạn nên đọc thêm về generators và co-routines ở bài viết này: https://medium.com/code-adventures/174f1fe66127

Tôi sẽ ví dụ nhanh, với Express từ trước đến giờ, mỗi khi cần truy suất vào database thì chỉ có mỗi cách gọi callback như sau:

function(req, res) {
  db.getUser(function(err, u) {
    if (err) return res.status(404).send(err);
    res.send(u)
  });
}

Chưa kể là còn gặp phải trường hợp Callback hell, nhiều callback lồng vào nhau và đợi lẫn nhau. Với Koa:

function *(next) {
  var user = yield db.getUser();
  this.body = user;
}

Koa có thể điều khiển luồng dữ liệu 1 cách trực quan nhất, cái bạn thấy đầu tiên là không cần sử dụng callback. Koa còn tương thích nhiều với các package co-*, cách tiếp cận khác khi làm việc với xử lý bất đồng bộ trong Nodejs. Tôi sẽ nó sâu hơn về co trong một dịp khác.

Cascading Middleware

Nếu bạn đã sử dụng qua Promises hay các framework control flow khác, mọi xử lý chỉ sẽ đi theo 1 luồng duy nhất, hoặc theo cơ chế ném-bắt callback. Koa middleware lại có cách xử lý hoàn toàn khác và mạnh mẽ hơn.

Theo ghi ở trang chủ, thì koa: yields "downstream", then control flows back "upstream".

Để giải thích, hay xem qua ví dụ về Koa logging sau:

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

Biến start sẽ lưu lại thời điểm bắt đầu, sau đó ứng dụng sẽ yields "downstream" đến router và các controller cần xử lý cho đến khi kết thúc. Control sẽ quay back lại hàm (middleware) này, tính thời gian thực thi và log ra màn hình.

Một ví dụ khác khi xử lý kết quả trả về được xử lý ở nhiều nơi khác nhau. Với Express có thể phức tạp hơn nhiều, và phải kết hợp với template engine (như handlebars, ...)

app.use(function *() {
  this.body = "...header stuff";
  yield saveResults();
  //could do some other yield here
  this.body += "...footer stuff"
});

function saveResults*() {
  //save some results
  this.body += "Results Saved!";
  //could do some other yield here
}

Tìm hiểu đầy đủ về middleware Koa tại đây: https://github.com/koajs/koa/blob/master/docs/guide.md

Koa lightweight

Khác với Express với hàng tá các middleware được cài đặt sẵn. Định hướng là 1 framework core tinh gọn, Koa không có bất kì middleware được tích hợp sẵn cả.

Có nhiều chức năng mà bạn sẽ cần phải cài thêm khi sử dụng koa tùy theo nhu cầu: routing, body parsing, basic authentication, static file serving, template rendering, ... Danh sách các middleware được liệt kê ở wiki: https://github.com/koajs/koa/wiki

Một số middleware nổi bật nên cài như:

Next

Koa tinh gọn, nên một số framework khác được build sẵn, bổ sung các chức năng mà koa đang thiếu:

  • api-boilerplate - an API application boilerplate
  • koa-generator - Koa' application generator just like express-generator(support 1.x && 2.x)
  • koala - a more feature-rich version of Koa (tích hợp sẵn nhiều middlewares có ích)
  • koan - Full stack JavaScript Web development boilerplate with Koa and Angular
  • surface - A tiny middleware of RESTful API for koa
  • ...

Với những bạn mới, tôi khuyên nên bắt đầu trước với koala hoặc koan.

Tham khảo

Javascriptkoaintro-jskoajsNode.jsExpress.jsNode