NODEJS VÀ NHỮNG ĐIỀU CẦN BIẾT

30/07/2021 46
nodejs-featured
CODEWELL

Việc nắm bắt những kiến thức chi tiết về NodeJS sẽ giúp bạn xây dựng các ứng dụng web một cách đơn giản và mở rộng cơ hội nghề nghiệp trong tương lai. Trong bài viết này, chuyên gia của CO-WELL Asia sẽ chia sẻ chi tiết thông qua một số câu hỏi phổ biến về NodeJS.

1.      Call stack là gì?

Call stack là một phần của V8. Đây là cấu trúc dữ liệu mà V8 sử dụng để theo dõi việc gọi function. Mỗi khi chúng ta gọi một function, V8 đặt một tham chiếu đến function đó trên Call stack và nó tiếp tục làm như vậy đối với mỗi lệnh gọi lồng nhau của các function khác. Cơ chế này cũng áp dụng cho các function đệ quy.

nodejs 1

Khi một function kết thúc (tính cả những lệnh gọi lồng nhau), V8 sẽ đưa function đó ra khỏi call stack và sử dụng giá trị trả về của function đó. Hãy ghi nhớ điều cơ bản này vì trong một Node process thì chỉ có một call stack. Nếu làm call stack này quá tải, tức là làm quá tải cả Node process. Hãy chú ý nhé!

2.    Event loop là gì và có thuộc V8 hay không?

nodejs 2

Event loop không thuộc V8, event loop thuộc libuv. Event loop được tạo ra để xử lý những external event và chuyển chúng thành các lệnh callback. Hiểu đơn giản là event loop lấy các event từ “event queue” và đẩy những callback của các event này vào Call stack.

nodejs 3

Nhìn vào sơ đồ trên, bạn có thể hiểu rõ hơn về vai trò của Event loop. Event loop nằm ở trung tâm của sơ đồ này, chi phối hoạt động của V8, Node APIs, và queue. Khi Call stack của V8 rỗng, event loop có thể quyết định được chương trình sẽ làm gì tiếp theo.

3.    Hệ thống Node sẽ ra sao khi cả Call stack và queue của Event loop rỗng?

Đơn giản là chương trình sẽ kết thúc. Khi chạy một chương trình Node, chương trình sẽ tự động khởi động event loop và khi event loop không hoạt động, chương trình sẽ dừng.

Để giữ cho process của Node chạy liên tục, bạn phải giữ cho queue của event loop không bị rỗng. Việc tạo ra một http server chính là đã yêu cầu Event loop chạy, liên tục kiểm tra và lắng nghe những event.

4.    Các external dependencies mà Node sử dụng ngoài V8 và libuv

Ngoài V8 và libuv, Node còn sử dụng những dependencies khác như: http-parser, c-ares, OpenSSL, zlib,… Node chỉ đơn thuần là sử dụng những thư viện này, chúng đều có source riêng và có license riêng.

Vì sao bạn nên biết điều này ư? Vì trong một số trường hợp, hệ thống của bạn bị crash, và có thể liên quan đến stack trong zlib hay một phần nào đó thuộc các thư viện này, đừng vội đổ lỗi hoàn toàn cho Node nhé!

5.    Nếu không có V8, Node có chạy được không?

V8 đóng vai trò là VM để Node process chạy trên đó. Nếu không sử dụng V8, bạn hoàn toàn có thể dùng một Engine khác đó là Chakra.

6.    Điểm khác nhau giữa module.exports và exports là gì?

Bạn có thể dùng module.exports để xuất API thuộc module của bạn. Và tương tự, những trường hợp đó bạn đều có thể dùng exports, ngoài trừ trường hợp này:

nodejs 4

Vì exports chỉ là một tham chiếu hay là một tên gọi tắt của module.exports. Nếu bạn thay đổi exports thì chính là thay đổi tham chiếu chứ không phải là đang thay đổi API gốc (module.exports).

7.    Vì sao một biến khai báo đầu file (top level variable) lại không phải là biến toàn cục (global variable)?

Trong file module1.js bạn khai báo 1 biến var x = 1. File module2.js bạn require module1.js. Và từ file Module2.js bạn thử access vào biến x, kết quả bạn nhận được sẽ là undefined. Nếu bạn làm việc này tương tự trên browser, thì tất cả những biến được define trong file Module1.js thì file Module2.js sẽ sử dụng được.

Có sự khác biệt này là do mỗi file của Node để được đóng gói thành IIFE (là tất cả các biến của mỗi file đều được đóng gói lại riêng biệt).

8.    Sẽ thế nào khi 2 module require nhau?

Nếu bạn để 2 module1.js và module2.js require lẫn nhau thì hoàn toàn không xảy ra lỗi đâu, với Node bạn có thể làm vậy tuy nhiên có thể xảy ra trường hợp không mong muốn.

Ví dụ khi thực hiện module1 và require module2, nhưng module2 lại cần module1, mà khi đó module1 chưa thực hiện xong, nên kết quả là module1 chỉ nhận được 1 phần của module2 mà thôi.

 

Huy CV – CO-WELL Asia

Trên đây là những hướng dẫn từ cơ bản tới chi tiết của chuyên gia từ CO-WELL Asia về NodeJS. Đừng quên theo dõi chuyên mục CODEWELL trên website CO-WELL Asia để đón đọc những bài viết công nghệ bổ ích nhé!