Express, Koa, Meteor, Sails.js: Bốn framework của Apocalypse (phần 1)

139

Do nhu cầu rất lớn dành cho các ứng dụng web, JavaScript đã trở thành 1 trong những ngôn ngữ nổi tiếng nhất trong những năm gần đây. Khi coding cho nhiều trình duyệt, JavaScript gần như là lựa chọn duy nhất dành cho các lập trình viên front-end. Tất nhiên, vẫn còn những phương án khác như CoffeeScript, TypeScript hoặc Dart nhưng trên thực tế, CoffeeScript được xem là syntactic sugar và cuối cùng cũng dẫn đến kết quả là JavaScript. TypeScript đơn giản là 1 bộ của JavaScript, gồm nhiều tính năng ngôn ngữ lập trình hướng đối tượng, như static typing, classes và interfaces tùy chọn, nhưng TypeScript vẫn còn đang giai đoạn phát triển. Dart cũng là 1 ngôn ngữ hướng đối tượng, có syntax giống C nhưng vẫn compiles các browsers chính với JavaScript.

Với sự ra đời và phát triển nhanh chóng của Node.js, JavaScript không còn bị “giam giữ” trong lập trình front-end, và lập trình back-end không còn là vấn đề khó khăn dành cho các coders front-end nữa. Mọi người có khuynh hướng cho rằng JavaScript là 1 “viên đạn bạc” có thể thích ứng trong mọi hoàn cảnh: front-end, web server, ứng dụng desktop, embedded system, databases … và danh sách này sẽ tiếp tục dài hơn. Trên thực tến, đối tượng mở rộng của JavaScript, Node.js+MongoDB+AngularJS/React cũng đã tạo nên 1 lượng lớn các lập trình viên web full stack. Tuy nhiên, Node.js đã được thiết kế tinh gọn lại và chỉ cung cấp các tính năng cơ bản như 1 web server để đẩy tốc độ lập trình ứng dụng web. Một trong những frameworks hay, có sẵn như npm packages sẽ là lựa chọn tốt hơn hiện nay.

Trong bài viết này, chúng ta sẽ điểm qua 1 trong những framework Node.js nổi tiếng, đã chứng tỏ được vai trò theo thời gian, giúp các lập trình viên không cần phải xây dựng lại từ đầu. Cụ thể, bài viết sẽ phân tích 4 frameworks Express, Koa, Meteor và Sails.js. Thay vì chỉ ra mỗi framework này đang cạnh tranh nhau ở những điểm nào, bài viết sẽ làm rõ những khía cạnh nổi bật của từng framework và cách chúng tương thích với các nhu cầu dự án đa dạng.

Express: Một framework web tối giản

Express là 1 món hời trong lĩnh vực Node.js. Mỗi “người chơi” Node.js đều nghe đến tên Express và sử dụng nó dù vô tình hay cố ý. Express đang ở thế hệ thứ 4, và có 1 vài Node.js frameworks được xây dựng trên Express hoặc lấy cảm hứng concept từ đây.

Hiệu suất

Hầu hết các lập trình viên yêu thích Node.js thì tốc độ nguyên thủy của nó, và khi nói đến việc lựa chọn framework thì 1 người theo chủ nghĩa hoàn hảo có thể sẽ coi thường các nguy cơ ảnh hưởng đến hiệu suất. Express cung cấp 1 layer day phía trên Node.js là các tính năng ứng dụng web như routing, middleware cơ bản, phục vụ các file statics và template engine, vì vậy hiệu suất I/O mạnh mẽ của Node.js sẽ không bị ảnh hưởng.

Express là 1 framework nhỏ gọn. Nó không áp dụng bất kì pattern thiết kế nào hiện thời như MVC, MVP, MVVM hay các xu hướng nào hiện nay. Đối với những ai yêu thích sự đơn giản, thì đây chính là điểm cộng lớn giữa các framework khác vì bạn có thể lập trình ứng dụng theo ý muốn của mình và không cần phải lĩnh hội kiến thức không cần thiết. Đặc điểm này đặc biệt thuận lợi khi bạn tạo dự án cá nhân mới chưa có nền tảng nào, nhưng khi dự án và đội ngũ lập trình lớn dần lên, việc thiếu tính chuẩn hóa có thể dẫn đến làm thêm những thứ khác liên quan đến quản lý dự án/ quản lý code và trường hợp xấu nhất là không có khả năng duy trì dự án/code.

Generator

Mặc dù framework Express nhỏ gọn nhưng nó có generator xuất ra cấu trúc project chuyên biệt. Sau khi cài đặt npm package express-generator và tạo sườn ứng dụng với generator, 1 folder ứng dụng được phân cấp rõ ràng sẽ được tạo để hỗ trợ bạn quản lý hình ảnh, front-end static JavaScript, các file theo dạng sheet và các file template HTML.

Middleware

Middleware là các hàm cơ bản, có khả năng tiếp cận toàn bộ với cả đối tượng request và response.

Như chính cái tên của mình, middleware áp dụng vài instruction filter trước khi xử lý đến business logic thực sự hoặc đến cấp độ khác của middleware. Một số nhiệm vụ thông thường nữa của middleware là kiểm tra tình trạng đăng nhập của người dùng, xác thực quyền của người dùng hoặc ngăn những cuộc tấn công chéo (cross-site)

Dù bạn muốn tùy chỉnh middleware riêng của mình hay tận dụng middleware built-in của framework thì một ứng dụng Express thực sự gồm Node.js cùng 1 loạt các hàm middleware giúp process trở nên tự nhiên và trực quan.

Template Engine

Template engines cho phép lập trình viên nhúng backend variables vào các files HTML và template file được request sẽ được xử lý để đơn giản lại format HTML với các variables được xen vào các giá trị thực sự. Theo mặc định, express-generator sử dụng Pug template engine (được biết đến với cái tên Jade), nhưng những lựa chọn khác như Mustache và EJS cũng làm việc hoàn hảo với Express.

Tích hợp Database

Là 1 framework nhỏ gọn, Express không hướng đến việc tích hợp database như 1 khía cạnh cần có trong package của mình, vì vậy Express không sử dụng database cụ thể nào. Khi chấp nhận 1 công nghệ lưu trữ dữ liệu cụ thể, dù là MySQL, MongoDB, PostgreSQL, Redis, ElasticSearch…, vấn đề chỉ là việc cài đặt npm package cụ thể như database driver. Những database drivers bên thứ 3 này không tương thích với syntax thống nhất khi thực hiện CRUD instructions, nên khi chuyển đổi databases sẽ có nguy cơ gặp lỗi và rắc rối.

Koa: Tối ưu hóa thế hệ các tính năng tiếp theo JavaScript

Koa được phát triển bởi đội ngũ đứng sau Express và mục tiêu của nó là tinh giản Express bằng cách không gộp bất kì middleware nào trong lõi của nó. Thay vì ít có middleware hơn, Koa lại có giao diện tương tự như Express, gọn nhẹ và không cứng nhắc. Tuy nhiên, lý do khiến Koa thực sự nổi bật là cách nó loại bỏ hoàn toàn callback bằng cashc sử dụng tính năng ES6 Generator.

Control flow (quy trình quản lý) gọn gàng

Javascript là 1 ngôn ngữ lập trình bất đồng bộ, và với đặc tính về ngôn ngữ và cơ chế hướng event đơn luồng (single threaded event-driven mechanism) của Node.js, callback ở khắp mọi nơi, kể cả callback hell khét tiếng.

Một cách để làm phẳng callback nesting là sử dụng Async.js. Async.js đem đến công nghệ map, parallelize, sắp xếp theo hàng (serialize) hoặc lặp lại nhiều hàm mà không cần nhúng cái này vào cái kia, sau đó chuyển giao sang control flow với 1 hàm callback, 1 callback và 1 hàm xử lý lỗi là đủ để Async.js method nhóm các nhóm hàm lại với nhau. Tuy nhiên, Async.js không thể dọn sạch toàn bộ callbacks. Khi viết code Node.js với Async.js, việc thụt dòng code vẫn có khuynh hướng dạt về bên phải, chứ không chỉ trôi xuống.

Then-able Promises là 1 cách khác gọn gàng hơn. Một số thư viên nổi tiếng bên thứ 3 của Promise là bluebrid và q. Trong phiên bản mới nhất của JavaScript, ES6, Promise đã được chuẩn hóa. Tóm lại, Promise đảm bảo việc execute và trả về các hàm được thực hiện liên tục bằng cách kết nối các blocks/ functionthực thi với 1 nhóm các Promise “then” functions. Bạn có thể giải quyết vào cuối mỗi block/ function thực thi để sau đó, hàm “then” tiếp theo được thực hiện, hoặc bạn “reject” thực thi tiếp theo để control flow lập tức giải quyết ngay các lỗi. Bằng cách này, bạn có thể tổng hợp các hàm gặp lỗi và loại bỏ hoàn toàn các callbacks.

Với ES6 Generator, ES6 đang dần thay đổi cuộc chơi. Khái niệm này tuy còn mới với JavaScript nhưng lại không mới mẻ gì trong thế giới lập trình. ES6 Generator giống như interruption trong C, thay vì chạy các dòng code từ trên xuống dưới, ES6 giới thiệu 1 công cụ để run->halt và chạy bất kì->trở về để kết thúc những gì còn sót lại.

Koa đang tận dụng ES6 Generators, để giải quyết lập trình bất đồng bộ JavaScript gọn gàng hơn, vì thế bạn không thể nhìn thấy các callbacks trong ứng dụng thuần Koa. Một trường hợp sử dụng ES6 Generator thông thường là phân tầng middleware, cho phép các middleware được tùy chỉnh có thể execute lần lượt mà không gặp phải các callbacks khó chịu.

Chúng ta không thể đi đến kết luận là công nghệ hiện đại này vượt trội so với các phương án cũ như Async.js, Promise hoặc event emitter. Nhưng có 1 thứ chắc chắn là bạn phải tốn thời gian để làm quen với concept mới này. Với trình tự control flow khác thường, các lập trình viên có thể sẽ gặp vài khó khăn để debug code.

Nguồn: IDE Academy via Techtalk via Toptal (còn tiếp)