Tổng quan về Node JS

1. NodeJS là gì?

NodeJS là một mã nguồn được xây dựng dựa trên nền tảng Javascript V8 Engine, nó được sử dụng để xây dựng các ứng dụng web như các trang video clip, các forum và đặc biệt là trang mạng xã hội phạm vi hẹp. NodeJS là một mã nguồn mở được sử dụng rộng bởi hàng ngàn lập trình viên trên toàn thế giới. NodeJS có thể chạy trên nhiều nền tảng hệ điều hành khác nhau từ WIndow cho tới Linux, OS X nên đó cũng là một lợi thế. NodeJS cung cấp các thư viện phong phú ở dạng Javascript Module khác nhau giúp đơn giản hóa việc lập trình và giảm thời gian ở mức thấp nhất.

2. Các đặc tính của NodeJS

  • Không đồng bộ: Tất cả các API của NodeJS đều không đồng bộ (none-blocking), nó chủ yếu dựa trên nền của NodeJS Server và chờ đợi Server trả dữ liệu về. Việc di chuyển máy chủ đến các API tiếp theo sau khi gọi và cơ chế thông báo các sự kiện của Node.js giúp máy chủ để có được một phản ứng từ các cuộc gọi API trước (Realtime).
  • Chạy rất nhanh: NodeJ được xây dựng dựa vào nền tảng V8 Javascript Engine nên việc thực thi chương trình rất nhanh.
  • Đơn luồng nhưng khả năng mở rộng cao: Node.js sử dụng một mô hình luồng duy nhất với sự kiện lặp. cơ chế tổ chức sự kiện giúp các máy chủ để đáp ứng một cách không ngăn chặn và làm cho máy chủ cao khả năng mở rộng như trái ngược với các máy chủ truyền thống mà tạo đề hạn chế để xử lý yêu cầu. Node.js sử dụng một chương trình đơn luồng và các chương trình tương tự có thể cung cấp dịch vụ cho một số lượng lớn hơn nhiều so với yêu cầu máy chủ truyền thống như Apache HTTP Server.
  • Không đệm:
    NodeJS không đệm bất kì một dữ liệu nào và các ứng dụng này chủ yếu là đầu ra dữ liệu.
  • Có giấy phép: NodeJS đã được cấp giấy phép bởi MIT License.

3.Node js làm việc như thế nào?

Ý tưởng chính của Node js là sử dụng non-blocking, hướng sự vào ra dữ liệu thông qua các tác vụ thời gian thực một cách nhanh chóng. Bởi vì, Node js có khả năng mở rộng nhanh chóng, khả năng xử lý một số lượng lớn các kết nối đồng thời bằng thông lượng cao. Nếu như các ứng dụng web truyền thống, các request tạo ra một luồng xử lý yêu cầu mới và chiếm RAM của hệ thống thì việc tài nguyên của hệ thống sẽ được sử dụng không hiệu quả. Chính vì lẽ đó giải pháp mà Node js đưa ra là sử dụng luồng đơn (Single-Threaded), kết hợp với non-blocking I/O để thực thi các request, cho phép hỗ trợ hàng chục ngàn kết nối đồng thời.

4.NPM: The Node Package Manager

Khi thảo luận về Node js thì một điều chắc chắn không nên bỏ qua là xây dựng package quản lý sử dụng các cộng cụ NPM mà mặc định với mọi cài đặt Node js. Ý tưởng của mô-đun NPM là khá tương tự như Ruby-Gems: một tập hợp các hàm có sẵn có thể sử dụng được, thành phần tái sử dụng, tập hợp các cài đặt dễ dàng thông qua kho lưu trữ trực tuyến với các phiên bản quản lý khác nhau.

Danh sách các mô-đun có thể tìm trên web NPM package hoặc có thể truy cập bằng cách sử dụng công cụ NPM CLI sẽ tự động cài đặt với Node js.

Một số các module NPM phổ biến nhất hiện nay là:

  • expressjs.com/ - Express.js, một Sinatra-inspired web framework khá phát triển của Node.js, chứa rất nhiều các ứng dụng chuẩn của Node.js ngày nay.
  • connect - Connect là một mở rộng của HTTP server framework cho Node.js, cung cấp một bộ sưu tập của hiệu suất cao "plugins" được biết đến như là trung gian; phục vụ như một nền tảng cơ sở cho Express
  • socket.io and sockjs - Hai thành phần Server-side websockets components nổi tiếng nhất hiện nay.
  • Jade - Một trong những engines mẫu, lấy cảm hứng từ HAML, một phần mặc định trong Express.js.
  • mongo and mongojs - MongoDB hàm bao để cung cấp các API cho cơ sở dữ liệu đối tượng trong MongoDB Node.js
  • redis - thư viện Redis client.
  • coffee-script - CoffeeScript trình biên dịch cho phép developers viết các chương trình Node.js của họ dùng Coffee.
  • underscore (lodash, lazy) - Thư viện tiện ích phổ biến nhất trong JavaScript, package được sử dụng với Node.js, cũng như hai đối tác của mình, hứa hẹn hiệu suất tốt hơn bằng cách lấy một cách tiếp cận thực hiện hơi khác nhau.
  • forever - Có lẽ là tiện ích phổ biến nhất để đảm bảo rằng một kịch bản nút cho chạy liên tục. Giữ quá trình Node.js của bạn lên trong sản xuất đối mặt với bất kỳ thất bại không ngờ tới.

5. Ví dụ về Node.js

Chat là thời gian thực, ứng dụng đa người dùng điển hình nhất, thông qua nhiều giao thức độc quyền và mở chạy trên các cổng không chuẩn, với khả năng thực hiện tất cả mọi thứ ngày hôm nay trong Node.js với WebSockets chạy qua cổng chuẩn 80.

Các ứng dụng chat thực sự là ví dụ điển hình nhất của Node.js: đó là một ứng dụng trao đổi thông tin nhanh chóng, lưu lượng truy cập cao, dữ liệu chuyên sâu (nhưng / xử lý tính toán thấp) ứng dụng chạy trên các thiết bị phân phối. Nó cũng là một trường hợp tuyệt vời cho học tập, vì nó đơn giản, nhưng nó bao gồm hầu hết các mô hình mà bạn từng được sử dụng trong một ứng dụng Node.js điển hình.

Trong ví dụ đơn giản nhất, chúng tôi có một phòng chat đơn trên trang web của chúng tôi, nơi mọi người đến và có thể trao đổi một hoặc nhiều tin nhắn (trên thực tế tất cả). Ví dụ, có ba người trên tất cả các trang web kết nối với bảng tin của chúng tôi.

Trên phía máy chủ, chúng ta có một ứng dụng đơn giản Express.js mà thực hiện hai điều:

  • GET '/' xử lý yêu cầu phục vụ các trang web có chứa cả một bảng thông báo và một nút "Send" để khởi đầu vào tin nhắn mới.
  • Một máy chủ WebSockets mà nghe cho thư mới được phát ra bởi các client WebSocket. Bên phía Client, chúng ta có một trang HTML với một vài xử lý thiết lập cho một sự kiện nhấn vào nút "Send", mà chọn lên các thông báo đầu vào và gửi nó xuống WebSocket, và một là lắng nghe cho message mới đến client WebSockets khác (tức là, các tin nhắn được gửi bởi người dùng khác, mà bên phía server muốn hiển thị trên toàn bộ các client).

Cùng phân tích quá trình khi một client gửi một message thì diễn ra các xử lý:

  • Trình duyệt bắt sự kiện nhấn nút "Send" thông qua một trình xử lý JavaScript, chọn lên các giá trị từ các trường đầu vào (tức là, các tin nhắn văn bản), và phát ra một thông điệp WebSocket sử dụng máy khách kết nối với máy chủ WebSocket (khởi tạo trên web khởi tạo trang).
  • Phần phía máy chủ của các kết nối WebSocket nhận message và chuyển tiếp nó tới tất cả các client kết nối khác sử dụng các phương thức broadcast.
  • Tất cả các client nhận được message mới như tin nhắn push thông qua một thành phần client-side WebSockets chạy trong trang web. Sau đó, họ lấy nội dung tin nhắn và cập nhật các trang web tại chỗ bằng cách thêm các bài viết mới cho broadcast. Đây là ví dụ đơn giản nhất. Đối với một giải pháp mạnh mẽ hơn, bạn có thể sử dụng một bộ nhớ cache đơn giản dựa trên các lưu trữ Redis. Hoặc trong một giải pháp tiên tiến hơn, một hàng đợi các message để xử lý việc định tuyến các message đến các client và một cơ chế phân phối mạnh mẽ hơn nên có thể trang trải cho các khoản lỗ kết nối tạm thời hoặc tin nhắn lưu trữ cho khách hàng đã đăng ký khi họ offline. Nhưng bất kể những cải tiến mà bạn thực hiện, Node.js sẽ vẫn được hoạt động theo các nguyên tắc cơ bản: phản ứng với các sự kiện, xử lý nhiều kết nối đồng thời, và duy trì tính lưu động trong trải nghiệm người dùng.

Tổng hợp từ nhiều nguồn