NodeJSHướng Dẫn

Node.js là gì và những khái niệm cơ bản về Node.js

Node.js là gì? Tại sao lại dùng node.js? Tốc độ chương trình của Node.js có gì đáng quan tâm? Sau đây là những khái niệm cơ bản cách thức node.js hoạt động, mọi người cùng nhau tìm hiểu nhé

Node.js là gì?

Nodejs là một nền tảng (Platform) phát triển độc lập được xây dựng ở trên Javascript Runtime của Chrome mà chúng ta có thể xây dựng được các ứng dụng mạng một cách nhanh chóng và dễ dàng mở rộng.

Là Javascript nhưng nó có một số tiến hóa đáng kể. Trong một thời gian dài Javascript được xem như là một cái gì đó nhỏ bé và thỉnh thoảng được dùng làm một chút hiệu ứng cho trang web. Tuy nhiên giờ đây Javascript trở thành một ngôn ngữ chính và được sử dụng nhiều như C, Ruby, PHP, và như nhiều ngôn ngữ khác nữa

Javascript đang khẳng định vị thế của mình, các web developers đang dần nhận ra tiềm năng của nó, mà vô tình chúng ta đã lờ nó quá lâu rồi hay thậm chí là đã coi thường nó

Nó hoàn toàn khác với Java, C và nhiều ngôn ngữ khác. Nó có thể hơi khó sử dụng nhưng mạnh khỏi chê.

Vậy giờ Node.js làm được gì? Vâng Node.js cho phép chúng ta sử dụng javascript trên server... nó cho phép chúng ta viết Javascript bên ngoài trình duyệt.

Tất nhiên Node.js thừa hưởng toàn bộ sức mạnh vốn có của Javascript và cho chúng ta thấy một cái nhìn toàn diện một cách mới mẻ về việc phát triển web động bằng Node.js

Node.js: server-side JavaScript

Hiện nay, Javascript luôn được dùng ở máy khách (Client-side), có nghĩa là javascript chỉ chạy phía bên người dùng trình duyệt web ví dụ các trình duyệt như: Firefox, Chrome, IE, v.v. chạy mã JavaScript và thực hiện các thao tác trên trang web (xem hình).

Luồng giải thích một request của client và server
Sơ đồ cơ bản: PHP trên server, Javascript cho client - Ảnh: Internet

Vậy có gì thay đổi khi xuất hiện Node.js?

Tuy nhiên, Node.js cung cấp một môi trường phía máy chủ nữa mà từ trước tới nay Javascript không làm được điều này ngoài ra cho phép chúng ta cũng sử dụng ngôn ngữ JavaScript để tạo các trang web. Nói chung nó thay thế các ngôn ngữ máy chủ như PHP, Java EE, v.v...

Với Node.js, chúng ta có thể sử dụng Javascript trên server - Ảnh: Internet

Tại sao Node.js có vẻ khác biệt? Có phải vì nó dùng javascript?

Đúng rồi, vì JavaScript là ngôn ngữ dựa trên các sự kiện, do đó Node.js cũng vậy. Chính vì vậy toàn bộ cách viết các ứng dụng đã thay đổi. Dẫn tới việc Node.js sẽ tận dụng toàn bộ sức mạnh và tốc độ của nó có được.

Vậy những ứng dụng nào được nên viết bằng Node.js?

  • Hệ thống tán gẫu (chat server)
  • Hệ thống Upload file
  • Và nói chung, bất kỳ ứng dụng nào cần đáp ứng lượng request nhiều liên tục trả kết quả về nhanh chóng và hiệu quả, trong thời gian thực.

Chú ý: Node.js không phải là framework. Theo một số cách nhìn thì nó giống C hơn PHP, Ruby on Rails, hoặc Django. Node.js không dành cho người mới toanh chưa biết gì về lập trình.

Tại sao Node.js lại nhanh?

Có 2 điều quan trọng chính yếu là: V8 engine và mô hình non-blocking

V8 Engine

Node.js sử dụng V8 Engine cực nhanh của Google Chrome để thực thi, V8 Engine tạo được nhiều tiếng vang khi lần đầu tiên Google Chrome phát hành, bởi vì nó là công cụ mã nguồn mở được tạo bởi Google, nó phân tích và chạy mã Javascript rất nhanh

Logo V8 Engine - Ảnh: Internet

Cho đến khi Chrome được phát hành, hầu hết các trình duyệt đều đọc mã JavaScript không hiệu quả: mã được đọc và diễn giải từng chút một. Trình duyệt mất rất nhiều thời gian để đọc mã JavaScript và chuyển đổi nó sang ngôn ngữ máy để bộ xử lý có thể hiểu nó.

Google Chrome’s V8 engine mà được Node.js sử dụng, hoạt động hoàn toàn khác nhau. Nó được tối ưu hóa cao và thực hiện những gì chúng ta gọi là biên dịch JIT (Just In Time). Nó nhanh chóng chuyển đổi mã Javascript thành ngôn ngữ máy thông qua các quy trình phức tạp như kỹ thuật "code inlining" và "copy elision"

Nói chung chúng ta cũng không cần quan tâm đến V8 engine nó hoạt động thế nào trong Node.js đâu. Chỉ cần nhớ rằng nó cho phép chạy JavaScript với tốc độ cực nhanh - những người sáng tạo của nó, các nhà phát triển của Google và họ là những kẻ "bặm trợn, khủng khiếp kinh dị Mỹ"

Mô hình Non-blocking

Vì JavaScript là ngôn ngữ được xây dựng bởi ý tưởng về các sự kiện, Node.js hoàn toàn cho phép các mã thuật toán non-blocking đặt vào bên trong.

Nhân tiện bạn có biết sự khác biệt giữa một blocking code và một non-blocking code? Nếu chưa mình sẽ có một vài giải thích nho nhỏ bên dưới cho bạn hiểu

Mô hình Blocking và mô hình non-blocking

Hãy tưởng tượng có một chương trình upload file và sau đó hiển thị file đó. Viết code theo dạng blocking theo ví dụ bên dưới

Upload the file
Display the file
Do something else

Các hành động trên được thực hiện theo tuần tự từ trên xuống dưới và phải kết thúc từng bước một mới làm việc khác.

  1. Chương trình sẽ tải tệp lên Internet.
  2. Chương trình sẽ hiển thị tệp cho người dùng.
  3. Sau đó, chương trình có thể làm những việc khác (ví dụ: thực hiện các hành động khác).

Vậy code dạng non-blocking là gì?

Upload a file
As soon as it’s finished, display the file
Do something else

Chương trình sẽ không còn thực hiện tuần tự từ trên xuống dưới nữa mà sẽ:

  1. Chương trình khởi chạy upload file lên.
  2. Chương trình làm những việc khác (các lệnh tiếp theo sau nó).
  3. Ngay sau khi quá trình upload file kết thúc, chương trình sẽ thực hiện các hành động mà chúng ta đã yêu cầu: nó sẽ hiển thị tệp.

Xem sơ đồ sau để hiểu rõ việc code non-blocking nó chạy thế nào

Non-blocking trong một chương trình - Ảnh: Internet

Đây là cách mà Node.js thực hiện. Ngay sau khi "Tập tin đã được tải lên", một hàm được gọi là hàm "callback" sẽ được gọi và thực hiện các hành động khác và ở ví dụ này hành động hiển thị file.

The non-blocking trong node.js

request(‘http://www.site.com/file.zip', function (error,
response , body) {
console.log("File uploaded!");
});
console.log("I do other things while I’m waiting…");

Tiến trình upload file được khởi chạy trước tiên. Sau đó, chương trình làm những việc khác (code ở trên, nó hiển thị một thông báo trong console, không nhất thiết phải hiện thông báo có thể hành động gì khác cũng được). Ngay sau khi quá trình upload file kết thúc, chương trình sẽ chuyển đến dòng 2 và hiển thị "File Uploaded!".

Nhưng làm thế nào nó hoạt động? Tui thấy cái hàm "request" có tham số thứ 2 là 1 cái hàm (function) mà trong đó nó chạy các lệnh? Nhìn ngộ ha?

Trả lời: Đừng lo! Những gì bạn ở đây là chức năng gọi lại (callback function). Trong JavaScript, chúng ta có thể gửi một chức năng như một thiết lập cho một chức năng khác. Trong trường hợp này, nó có nghĩa là "Chạy chức năng này khi quá trình upload file kết thúc".

Bạn cũng thấy code ở trên có 1 cái hàm không có tên, vì vậy nó còn được gọi là hàm ẩn danh. Nhưng chúng ta có thể tách ra như thế này, kết quả sẽ giống y chang.

// Identical result to the previous code

var callback = function (error, response, body) {
console.log ("File uploaded!");
});

request (‘http://www.site.com/file.zip',callback);
console.log ("I do other things while I’m waiting…");

Hàm ẩn danh được lưu trong một biến. Giống như tất cả các hàm khác, nó không chạy nếu như không được gọi.

Khi đó, chúng ta chuyển cái hàm ẩn danh này như 1 thiết lập của hàm request() kiểu như là: "chạy xong tiến trình upload file, kế đến là gọi cái hàm này"

Thực tế thì đa số các developer Javascript thường sẽ gõ hàm ẩn danh này bên trong trực tiếp cái hàm mà nó đang gọi như là một thiết lập, nhìn có vẻ hơi lạ nhưng rồi chúng ta sẽ dần quen với nó hơn trong tương lai thôi.

Tui không thấy lý do gì nó sẽ làm cho chương trình chạy nhanh hơn. Có vẻ như nó làm cho nó phức tạp hơn!

Như mình đã nói là Node.js không đơn giản, từ từ bạn sẽ thấy vì sao nó lại nhanh, ví dụ giờ bạn tưởng tượng có 2 files sẽ được upload khi sử dụng bằng Node.js

var callback = function (error, response, body) {
console.log ("File uploaded!");
});

request (‘http://www.site.com/file.zip’, callback);
request (‘http://www.site.com/otherfile.zip’, callback);

Nếu là kiểu chương trình thực hiện các dòng lệnh theo tuần tự, từ trên xuống dưới (blocking) thì sẽ tiến hành các bước sau đây:

  1. Khởi chạy upload file thứ nhất đợi nó cho tới khi hoàn thành
  2. Sau đó mới khởi chạy upload file thứ hai cho tới khi nó hoàn thành

Tuy nhiên với Node.js, hai tiến trình upload file sẽ được khởi chạy cùng một lúc, chương trình sẽ không chờ tiến trình upload file thứ nhất kết thúc rồi mới thực hiện khởi chạy tiến trình upload file thứ 2

Vì vậy chương trình sẽ nhanh hơn rất nhiều lần do tiến trình upload 2 file cùng lúc được diễn ra, nhìn hình ví dụ bên dưới:

Chương trình chạy theo kiểu non-blocking (giống Node.js), có 2 file được upload cùng một lúc, và ta sẽ thấy được tốc độ của chương trình. - Ảnh: Internet

Node.js thường được dùng trong các ứng dụng web có tiến trình diễn ra lâu ví dụ như là:

  • Gọi đến một cơ sở dữ liệu
  • Gọi api của một dịch vụ web nào đó (vd: Twitter’s API)

Node.js giúp chúng ta tránh tình trạng lãng phí thời gian, bằng cách cho phép chúng ta thực hiện những việc khác trong khi chờ đợi những tiến trình cần thời gian dài để kết thúc!

Tóm lại:

Node.js là một nền tảng lập trình mã nguồn mở dựa trên JavaScript. Nó cho phép lập trình viên sử dụng JavaScript để viết các ứng dụng phía máy chủ (server-side applications) thay vì chỉ dùng JavaScript ở phía trình duyệt (client-side) như trước đây.

Node.js sử dụng kiến trúc hướng sự kiện (event-driven architecture) với bộ xử lý sự kiện vòng lặp (event loop) để xử lý các yêu cầu. Nó cũng sử dụng các API phi đồng bộ (non-blocking APIs) để có thể xử lý nhiều yêu cầu cùng lúc mà không bị chặn.

Điểm mạnh của Node.js

  • Sử dụng JavaScript nên rất quen thuộc với frontend developers.
  • Có khả năng xử lý các kết nối đồng thời (concurrent connections) rất tốt.
  • Cộng đồng lớn, hệ sinh thái phong phú với nhiều module/package hữu ích.
  • Hiệu năng xử lý tốt, nhẹ và nhanh.
  • Có thể chạy trên nhiều nền tảng khác nhau.

Ứng dụng của Node.js

Một số ứng dụng phổ biến của Node.js:

  • Xây dựng các ứng dụng web/API (RESTful APIs)
  • Xây dựng các ứng dụng real-time, chat app sử dụng WebSocket
  • Các công cụ dòng lệnh (command-line tools)
  • IoT - Internet of Things
  • Game phía server

Như vậy, Node.js là một nền tảng lập trình hiệu năng cao, mã nguồn mở giúp lập trình viên JavaScript có thể viết backend một cách dễ dàng và hiệu quả. Nó đang ngày càng phổ biến và được sử dụng rộng rãi trong các ứng dụng web.

Tags

Bài viết liên quan

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Back to top button
Close