Node.js là một môi trường runtime JavaScript. Nghe hay đấy, nhưng điều đó có nghĩa là gì? Nó hoạt động như thế nào?

Môi trường runtime Node.js bao gồm mọi thứ cần có để thực thi một chương trình được viết bằng JavaScript.


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

Giờ đây, bạn có thể làm được nhiều việc hơn với JavaScript ngoài việc tạo tính tương tác cho các trang web. JavaScript hiện có khả năng làm những việc mà các ngôn ngữ lập trình kịch bản (scripting language) khác, như Python, có thể làm.

Cả trình duyệt JavaScript và Node.js đều chạy trên công cụ runtime JavaScript V8. Công cụ này lấy mã JavaScript và chuyển nó thành mã máy nhanh hơn. Mã máy (machine code) là mã cấp thấp mà máy tính có thể chạy mà không cần giải thích trước.

Tại sao người ta chọn Node.js?

Dưới đây là một định nghĩa trên trang web chính thức của Node.js:

Node.js® là một trình chạy JavaScript được xây dựng trên công cụ JavaScript V8 của Chrome.

Node.js sử dụng mô hình I/O hướng sự kiện (event-driven), không chặn (non-blocking), giúp nó nhẹ và hiệu quả.

Hệ sinh thái gói (package ecosystem) của Node.js, npm, là hệ sinh thái thư viện mã nguồn mở lớn nhất trên thế giới.

Dòng đầu tiên của định nghĩa này đã được thảo luận ở phần trên. Bây giờ, hãy tìm hiểu hai dòng còn lại để giải mã sự phổ biến toàn cầu của Node.js.

I/O đề cập đến đầu vào/đầu ra. Nó có thể là bất cứ thứ gì, từ đọc/ghi các tệp cục bộ đến thực hiện một yêu cầu HTTP tới một API. 

Hãy xem xét một tình huống trong đó chúng ta yêu cầu một cơ sở dữ liệu phụ trợ cho các chi tiết của user1 và user2, sau đó print chúng trên màn hình/bảng điều khiển. Việc phản hồi yêu cầu này cần thời gian, nhưng cả hai yêu cầu dữ liệu người dùng có thể được thực hiện độc lập và đồng thời.

Blocking I/O

Trong phương pháp chặn này, yêu cầu dữ liệu của user2 không được bắt đầu cho đến khi dữ liệu của user1 được print ra màn hình.

Nếu đây là một máy chủ web, bạn sẽ phải bắt đầu một chuỗi mới cho mọi người dùng mới. Nhưng JavaScript có tính đơn luồng (single-threaded) (cũng không hẳn, nhưng nó có một vòng lặp sự kiện đơn luồng, chúng ta sẽ thảo luận một chút ở phần dưới). Vì vậy, điều này sẽ khiến JavaScript không mấy phù hợp cho các tác vụ đa luồng (multi-threaded).

Đó là lý do mà non-blockiong I/O ra đời.

Non-blocking I/O

Mặt khác, nếu sử dụng yêu cầu non-blocking, bạn có thể bắt đầu một yêu cầu dữ liệu cho user2 mà không cần đợi phản hồi cho yêu cầu của user1. Nghĩa là, bạn có thể bắt đầu cả hai yêu cầu song song.

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

Vòng lặp sự kiện JavaScript

Nếu bạn đang dư dả 26 phút, hãy xem video giải thích tuyệt vời này về Node Event Loop:

 

<iframe width="720" height="405" src="https://www.youtube.com/embed/8aGhZQkoFbQ" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

 

Nếu không, sau đây là một hướng dẫn step-by-step nhanh gọn về cách hoạt động của vòng lặp sự kiện JavaScript. 

  1. Đẩy main() lên call stack.
  2.  Đẩy console.log() lên call stack. Chương trình sẽ chạy ngay và được bật lên. 
  3. Đẩy setTimeout(2000) lên stack. setTimeout(2000) là một Node API. Khi bạn gọi nó, bạn đã đăng ký cặp event-callback. Sự kiện này sẽ chờ 2000 mili giây sau đó callback là function.  
  4. Sau khi hoàn thành đăng ký đó trong các API. setTimeout(2000) được bật lên từ call stack.
  5. Tiếp theo setTimeout(0) thứ hai được đăng ký bằng cách tương tự. Giờ ta đã có hai Node API sẵn sàng để được thực thi. 
  6. Sau khi chờ 0 giây, setTimeout(0) được chuyển đến callback queue (hàng chờ gọi lại), tương tự với setTimeout(2000).
  7. Trong callback queue, các functions chờ đến khi call stack rỗng, bởi vì chỉ có duy nhất một lệnh được thực thi vào một thời điểm. Vòng lặp sự kiện lo cho quá trình này. 
  8. console.log() cuối cùng chạy, main() được bật ra từ call stack. 
  9. Vòng lặp sự kiện nhận thấy rằng call stack đã rỗng trong khi callback queue thì chưa, nên nó chuyển các callback (theo thứ tự vào trước thì ra trước) đến call stack để được thực thi. 

Npm

Đây là những thư viện được xây dựng bởi một cộng đồng tuyệt vời, sẽ giải quyết hầu hết các vấn đề chung trong lập trình JS của bạn. npm (Node package manager) có các gói bạn có thể sử dụng để phát triển ứng dụng của mình nhanh chóng và hiệu quả hơn.

Require (yêu cầu)

Require làm ba điều:

  • Tải các module đi kèm với Node.js như hệ thống tệp và HTTP từ API Node.js.
  • Tải các thư viện của bên thứ ba như Express và Mongoose mà bạn cài đặt từ npm.
  • Cho phép bạn yêu cầu các tệp của riêng mình và module hóa dự án.

Require là một function, nó chấp nhận một tham số "path" và trả về module.exports.

Node module

Node module là một khối mã có thể tái sử dụng, sự tồn tại của nó không vô tình tác động đến mã khác.

Bạn có thể viết các module của riêng mình và sử dụng nó trong các ứng dụng khác nhau. Node.js có một tập hợp các module tích hợp sẵn mà bạn có thể sử dụng mà không cần cài đặt thêm.

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

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

JavaScript -> V8 (C ++) -> Mã máy

V8 triển khai một tập lệnh được gọi là ECMAScript như được chỉ định trong ECMA-262. ECMAScript được Ecma International tạo ra để chuẩn hóa JavaScript.

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

Điều này về cơ bản 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 mã C++, để mã C++ của bạn hiểu nhiều hơn những gì tiêu chuẩn ECMAScript chỉ định khác.

P.S: Có rất nhiều công cụ runtime JavaScript khác ngoài V8 của Chrome, như SpiderMonkey của Mozilla, Chakra của Microsoft, v.v.

Sự kiện

Hiểu nôm na, sự kiện là điều gì đó đã xảy ra trong ứng dụng của chúng ta mà ta có thể phản hồi lại. Có hai loại sự kiện trong Node:

  • Sự kiện hệ thống (system event): C++, có lõi từ một thư viện có tên là libuv. (Ví dụ: đọc xong một tập tin).
  • Sự kiện tùy chỉnh (custom event): Lõi JavaScript.

Viết Hello World trong Node.js

Thủ tục bất hủ phải được thực thi phải không nào? Triển thôi.

Tạo một tệp app.js và thêm phần bên dưới vào tệp đó.

 

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.

Tèn ten! Bạn vừa viết được chữ “Hello World” trong Node.js rồi đó.

Có rất nhiều nguồn mở hiện nay để bạn tìm học nhiều hơn về Node.js. Bạn có thể theo dõi trang blog VietnamWorks InTECH để cập nhật thêm không chỉ về Node.js mà còn về rất nhiều kiến thức công nghệ - lập trình hấp dẫn khác. 

 

Tổng hợp việc làm IT - Software trên VietnamWorks
VietnamWorks InTECH
Theo freecodecamp

TẠO TÀI KHOẢN MỚI: XEM FULL “1 TÁCH CODEFEE” - NHẬN SLOT TƯ VẤN CV TỪ CHUYÊN GIA - CƠ HỘI RINH VỀ VOUCHER 200K