Node.js là gì và tại sao tôi nên học lập trình Node.js?

JavaScript chỉ là một ngôn ngữ lập trình phía client chạy trên trình duyệt, phải không? Nhưng điều này không còn đúng chút nào nữa. Node.js là một cách để chạy JavaScript trên server; nhưng nó còn hơn thế nữa. Nếu bạn là một người có hứng thú trong việc phát triển web, thì bạn nên tìm hiểu đôi chút về Node.js và lý do tại sao nó đang tạo ra một làn sóng trong cộng đồng.

Node.js là gì?

Node.js là một nền tảng chạy trên môi trường V8 JavaScript runtime – một trình thông dịch JavaScript cực nhanh chạy trên trình duyệt Chrome. Bình thường thì bạn cũng có thể tải bộ V8 và nhúng nó vào bất cứ thứ gì; Node.js làm điều đó đối với các web server. JavaScript suy cho cùng cũng chỉ là một ngôn ngữ – vậy thì không có lý do gì để nói nó không thể sử dụng trên môi trường server tốt như là trong trình duyệt của người dùng được.

Trong một môi trường server điển hình LAMP (Linux-Apache-MySQL-PHP), bạn có một web server là Apache hoặc NGINX nằm dưới, cùng với PHP chạy trên nó. Mỗi một kết nối tới server sẽ sinh ra một thread mới, và điều này khiến ứng dụng nhanh chóng trở nên chậm chạp hoặc quá tải – cách duy nhất để hỗ trợ nhiều người dùng hơn là bằng cách bổ sung thêm nhiều máy chủ. Đơn giản là nó không có khả năng mở rộng tốt. Nhưng với Node.js thì điều này không phải là vấn đề. Không có một máy chủ Apache lắng nghe các kết nối tới và trả về mã trạng thái HTTP – bạn sẽ phải tự quản lý kiến trúc lõi của máy chủ đó. May mắn thay, có một số module giúp thực hiện điều này được dễ dàng hơn, nhưng công việc này vẫn gây cho bạn một chút khó khăn khi mới bắt đầu. Tuy nhiên, kết quả thu được là một ứng dụng web có tốc độ thực thi cao.

Klout – Một ứng dụng web thống kê các hoạt động xã hội được xây dựng dựa trên Node.js vì ưu điểm tốc độ thực thi cao
Klout – Một ứng dụng web thống kê các hoạt động xã hội được xây dựng dựa trên Node.js vì ưu điểm tốc độ thực thi cao

JavaScript là một ngôn ngữ dựa trên sự kiện, vì vậy bất cứ thứ gì xảy ra trên server đều tạo ra một sự kiện non-blocking. Mỗi kết nối mới sinh ra một sự kiện; dữ liệu nhận được từ một upload form sinh ra một sự kiện data-received; việc truy vấn dữ liệu từ database cũng sinh ra một sự kiện. Trong thực tế, điều này có nghĩa là một trang web Node.js sẽ chẳng bao giờ bị khóa (lock up) và có thể hỗ trợ cho hàng chục nghìn user truy cập cùng lúc. Node.js đóng vai trò của server – Apache – và thông dịch mã ứng dụng chạy trên nó. Giống như Apache, có rất nhiều module (thư viện) có thể được cài đặt để bổ sung thêm các đặc trưng và chức năng – như lưu trữ dữ liệu, hỗ trợ file Zip, đăng nhập bằng Facebook, hoặc các cổng thanh toán. Dĩ nhiên, nó không có nhiều thư viện như PHP, nhưng Node.js vẫn đang ở trong giai đoạn ban đầu và có một cộng đồng rất mạnh mẽ ở đằng sau nó.

Một khái niệm cốt lõi của Node.js đó là các function bất đồng bộ (asynchronous functions) – vì vậy về cơ bản thì mọi thứ chạy trên nền tảng này. Với hầu hết các ngôn ngữ kịch bản máy chủ, chương trình phải đợi mỗi function thực thi xong trước khi có thể tiếp tục chạy tiếp. Với Node.js, bạn xác định các function sẽ chạy để hoàn thành một tác vụ nào đó, trong khi phần còn lại của ứng dụng vẫn chạy đồng thời. Nó là một chủ đề phức tạp mà tôi sẽ không đi vào quá sâu trong bài viết này, nhưng đó là một trong những đặc trưng tiêu biểu của Node.js, vì vậy việc nắm vững nó là điều hết sức quan trọng. Tuy nhiên tôi sẽ đưa ra một ví dụ Hello World để mang lại cho bạn một cái nhìn thoáng qua một vài những khái niệm này.

var http = require("http");   
http.createServer(function (request, response) {   
response.writeHead(200, {   'Content-Type': 'text/plain'   });   
response.write('Hello World!');   
response.end();  }).listen(8080);  
console.log("Server running!");

Hãy thử phân tích đoạn code trên. Đầu tiên, chúng ta including module http vào trong project. Sau đó chúng ta tạo ra một server và truyền vào một function anonymous như một tham số – function này sẽ được gọi khi mỗi kết nối mới sinh ra. Nó có hai đối số – request, bao gồm các tham số yêu cầu từ người dùng; và response, cái chúng ta sử dụng để gửi kết quả trả về. Tiếp đến, chúng ta sử dụng đối tượng response đó để write một header tới người dùng với mã HTTP response là 200(“ok”) và content type, viết ra một message “Hello World!”, và kết thúc response đó.

Cuối cùng, chúng ta nói server lắng nghe các request đến trên cổng 8080, và xuất ra một message trên cửa sổ console (command line) để báo cho chúng ta biết rằng nó đang hoạt động. Nếu bạn muốn thực sự làm thử, thì hãy lưu đoạn code trên thành file test.js, tải bộ cài đặt Node.js về, và từ cửa sổ command line chạy dòng lệnh sau –

node test.js

Sau đó mở trình duyệt lên và truy cập vào địa chỉ localhost:8080 để xem ứng dụng đầu tay của bạn! Lúc này bạn sẽ có một chút ý niệm về cách làm thế nào mà toàn bộ quá trình bất đồng bộ (asynchronous) hoạt động, đi cùng với các mô hình hướng sự kiện. Nếu bạn là một người mới tiếp xúc với JavaScript, thì khái niệm truyền các function như là một đối số của function khác có thể có một chút lạ lẫm.

Tại sao lại sử dụng Node.js?

Đầu tiên là ưu điểm về tốc độ thực thi và khả năng mở rộng. Node.js có tốc độ rất nhanh. Đó là một yêu cầu khá quan trọng khi bạn là một startup đang cố gắng tạo ra một sản phẩm lớn và muốn đảm bảo có thể mở rộng nhanh chóng, đáp ứng được một lượng lớn người dùng khi trang web của bạn phát triển lên.

Node.js cũng hoàn hảo khi đưa ra một RESTful API – một web service sẽ nhận vào một ít tham số và trả về một ít dữ liệu – thao tác dữ liệu một cách đơn giản mà không cần tính toán với số lượng lớn. Node.js có thể xử lý hàng ngàn kết nối đồng thời trong khi PHP sẽ chỉ có nước sụp đổ. Bên cạnh các lợi ích về tốc độ thực thi và khả năng mở rộng, có thể bạn cũng đã biết một chút về JavaScript, vì vậy tại sao lại phải phiền toái để học thêm về một ngôn ngữ lập trình hoàn toàn mới như PHP? Và sau đó bạn sẽ có một sự phấn khích khi học về một cái gì đó mới mẻ và gần như chưa được khám phá. Bạn còn nhớ cái cảm giác khi mà một cái gì đó mới xuất hiện và sau đó trở thành phổ biến khắp mọi nơi mà bạn hối tiếc đã không học về nó sớm hơn, và mãi mãi chỉ là người đến sau? Đừng phạm phải sai lầm như vậy lần này nữa. Node.js đang ngày càng trở nên lớn mạnh hơn.

Nhược điểm

Giống như hầu hết các công nghệ mới, việc triển khai Node.js trên host không phải là điều dễ dàng. Nếu bạn có một web hosting xài chung, bạn không thể đơn giản tải lên một ứng dụng Node.js và mong chờ nó hoạt động tốt. VPS và dedicated server là một sự lựa chọn tốt hơn – bạn có thể cài đặt Node.js trên chúng. Thậm chí dễ hơn là sử dụng một dịch vụ có khả năng mở rộng như là Heroku, và bạn có thể hoàn toàn an tâm để phát triển trang web của mình trên đó – bạn chỉ cần trả tiền khi cần thêm nhiều tài nguyên hơn.

Mặt khác, chúng ta rất dễ cài đặt Node.js chạy cục bộ trên máy tính của bạn sử dụng các hệ điều hành như Windows, Mac hoặc Linux và bắt đầu phát triển ứng dụng ngay lập tức – chỉ việc tải phiên bản Node.js tương ứng tại đây. Một điều quan trọng nên chú ý là Node.js không chỉ đơn giản là một sự thay thế cho Apache – các ứng dụng web đang tồn tại sẽ không có khả năng tương thích, và bạn sẽ làm việc hiệu quả với những ứng dụng phát triển từ đầu (mặc dù có rất nhiều framework ngoài kia để giúp đỡ bạn với nhiều đặc trưng phổ biến).

Một nhược điểm lớn khác của Node.js đó là nó vẫn đang trong giai đoạn phát triển ban đầu, điều này có nghĩa là một số đặc trưng sẽ thay đổi trong quá trình phát triển tiếp theo. Trong thực tế, nếu bạn đọc các tài liệu đi kèm, thì nó bao gồm một chỉ số ổn định (stability index), chỉ số này cho thấy mức độ rủi ro khi bạn sử dụng các đặc trưng hiện có.

Chỉ số ổn định của các module trong Node.js

Bạn biết đấy – sẽ chẳng bao giờ có thời điểm nào tuyệt vời hơn để trở thành một nhà phát triển web. Với các web service và trao đổi dữ liệu mở, thì việc tạo ra một ứng dụng tuyệt vời chưa bao giờ dễ như lúc này. Có phải bạn đang nghĩ rằng mình nên học Node.js? Tốt lắm. Hãy tiến lên phía trước và tạo ra một sản phẩm Twitter tiếp theo! Có thể bạn cũng muốn có một nền tảng kiến thức tốt về thư viện JavaScript jQuery để xây dựng phần front end.

Về tác giả bài viết:

James là một lập trình viên có nhiều năm kinh nghiệm trong lĩnh vực phát triển phần mềm, đồng thời anh cũng là một tín đồ của game và các kỷ lục trên Technophilia. Bạn có thể liên hệ với anh qua email jamesbruce[at]makeuseof.com

Bài viết được Techmaster.vn dịch từ trang web MakeUseOf

Leave a reply:

Your email address will not be published.

Site Footer