Node.js thực sự là gì?

Node.js là gì?

Node.js được xây dựng dựa trên JavaScript runtime. Nghe thật tuyệt, nhưng mà nó có nghĩa là gì? Nó hoạt động như thế nào?

Nền tảng Node runtime bao gồm mọi thứ mà bạn cần để hoàn thành một chương trình viết bằng JavaScript.

Node.js là gì

Nếu bạn đã biết Java là gì, thì định nghĩa Node.js là gì cũng có một số điểm giống nhau.

NodeJS là một nền tảng được xây dựng trên “V8 Javascript engine” được viết bằng c++ và Javascript. Nền tảng này được phát triển bởi Ryan Lienhart Dahl vào năm 2009.

Node.js ra đời khi các developer đời đầu của JavaScript mở rộng nó từ một thứ bạn chỉ chạy được trên trình duyệt thành một thứ bạn có thể chạy trên máy của mình dưới dạng ứng dụng độc lập.

Giờ đây bạn có thể làm được nhiều thứ với JavaScript hơn là chỉ tương tác với các website.

JavaScript giờ có khả năng làm những thứ và những ngôn ngữ lập trình scripting như Python có thể làm.

Cả trình duyệt JavaScript và Node.js đều chạy trên JavaScript runtime V8 engine. Công cụ này lấy code JavaScript của bạn và convert nó sang mã máy (bytecode) cho việc thực thi nhanh hơn. Mã máy là loại code thấp cấp hơn để máy tính có thể chạy mà không cần biên dịch nó.

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

Đây là định nghĩa chính thức trên trang web chính của Node.js:

“Node.js là một JavaScript runtime được build dựa trên engine JavaScript V8 của Chrome. Node.js sử dụng kiến trúc hướng sự kiện event-driven, mô hình non-blocking I/O làm cho nó nhẹ và hiệu quả hơn. Hệ thống nén của Node.js, npm, là hệ thống thư viện nguồn mở lớn nhất thế giới.”

Chúng ta đã khá quen với dòng đầu trong định nghĩa này rồi. Nên giờ hãy nói về 2 dòng còn lại để hiểu được tại sao Node.js lại phổ biến đến vậy nhé.

I/O là Input/Output. Nó có thể là bất cứ thứ gì từ đọc/viết các file nội bộ cho đến tạo HTTP đến API.

I/O tốn thời gian và do đó nó sẽ chặn các chức năng khác.

Xét một tình huống là chúng ta cần dữ liệu backend chi tiết cho user1 và user2 và sau đó hiển thị chúng trên màn hình hoặc bảng điều khiển. Để phản hồi cho lệnh này sẽ mất thời gian, nhưng cả 2 dữ liệu user có thể thực hiện độc lập và cùng lúc.

Node.js là gì

Blocking I/O (trái) và Non-Blocking I/O (phải)

Blocking I/O

Trong phương thức blocking, dữ liệu của user2 sẽ không bắt đầu cho đến khi dữ liệu của user1 xuất trên màn hình.

Nếu đây là một server web, chúng ta phải bắt đầu một thread mới cho từng user mới. Nhưng JavaScript là đơn luồng (tính chất “xong cái này mới đến cái khác”). Và điều này làm JavaScript không phù hợp cho các tác vụ đa luồng.

Đó là lý do non-blocking xuất hiện.

Non-blocking I/O

Mặt khác, sử dụng request non-blocking, bạn có thể request dữ liệu cho user2 mà không phải đợi phản hồi request từ user1. Bạn có thể bắt đầu cả 2 request song song.

Non-blocking I/O loại bỏ nhu cầu đa luồng vì server có thể xử lý nhiều request cùng một lúc.

JavaScript Event Loop

Nếu bạn có 26 phút rảnh, hãy xem qua video xuất sắc này giải thích Vòng lặp sự kiện Node là gì:

Còn nếu bạn không rảnh thì đây là giải thích từng bước nhanh gọn về cách JavaScript Event Loop hoạt động.

Node.js là gì

npm

lập trình web

Đây là những thư viện được tạo nên bởi 1 cộng đồng tuyệt vời mà sẽ giải quyết được hầu hết các vấn đề chung của bạn. npm (Node Package Manager) có những phiên bản bạn có thể sử dụng trong app để lập trình nhanh và hiệu quả hơn.

Require

Require làm 3 thứ:

  • Tải module đi kèm với Node.js như hệ thống file và HTTP từ Node.js API.
  • Tải thư viện thứ 3 như Express và Mongoose mà bạn cài đặt từ npm.
  • Giúp bạn require file của bạn và mo-đun hoá project.

Require là 1 chức năng, và nó nhận tham số path tinh chỉnh và trả về module.export.

Node Modules

Module Node là 1 block code có thể tái sử dụng mà sự tồn tại của nó không vô tình ảnh hưởng đến các code khác.

Bạn có thể tạo module của riêng mình và sử dụng nó với nhiều ứng dụng khác nhau. Node.js có 1 bộ built-in module bạn có thể sử dụng mà không cần cài đặt thêm gì nữa.

V8 turbo-charges JavaScript bằng cách tận dụng C++

V8 là một công cụ runtime nguồn mở được viết bằng C++.

JavaScript -> V8(C++) -> Machine Code

V8 thực hiện một tệp lệnh gọi là ECMAScript như được chỉ định trong ECMA-262. ECMAScript được tạo ra bởi Ecma International để chuẩn hoá JavaScript.

V8 có thể chạy độc lập hoặc được nhúng vào ứng dụng C++ bất kỳ. Nó có các móc nối cho phép bạn viết C++ của riêng bạn và cung cấp cho JavaScript.

Về cơ bản việc này cho phép bạn thêm các tính năng vào JavaScript bằng cách nhúng V8 vào code C++ để code C++ của bạn có thể hiểu hơn những gì ECMAScript chỉ định.

P/s: Như Greg Bulmash đã nói tới, có nhiều công cụ runtime JavaScript ngoài V8 của Chrome như SpiderMonkey của Mozilla, Chakra của Microsoft,v.v…

Events

Có một số thứ xảy ra trong app của bọn mình mà mình có thể trả lời. Có 2 loại event trong Node:

  • Events System: C++ có lõi từ một thư viện gọi là libuv. (Vd, đọc xong 1 file).
  • Events Custom: Lõi JavaScript

Viết “Hello World” trong Node.js

Chúng ta phải làm chuyện này đúng không nào?

Tạo 1 file tên app.js và thêm vào dòng dưới:

console.log("Hello World!");

Mở node của bạn lên, chuyển danh mục thành thư mục nơi mà file được lưu và chạy node app.js.

Bài viết gốc tại: medium

Xem thêm việc làm Node.js trên TopDev!