Kiến trúc Node.js - Giới thiệu về Node.js

Kiến trúc Node.js - Giới thiệu về Node.js

Tin ngắn hàng ngày dành cho bạn
  • Đây là bài viết thứ 366, có nghĩa là mình đã duy trì được việc mỗi ngày một bài trong chuyên mục Threads 1 năm rồi đấy mọi người. Tuy rằng không phải ngày nào cũng viết vì nhiều hôm mình bận, quên thì hôm sau là lên bài bù, mục đích là để cam kết với độc giả, ấy vậy mà quay đi quay lại đã một năm trôi qua rồi. Nhanh thật 😃

    À mai, kia, ngày kìa nữa mình đi du lịch nên chắc không lên bài cho mọi người được. Về rồi mình lên sau nhé 😅. Cảm ơn!

    » Xem thêm
  • Hơn 1 tuần nay mình không đăng bài, không phải không có gì để viết mà đang tìm cách để phân phối nội dung có giá trị hơn trong thời đại AI đang bùng nổ mạnh mẽ như thế này.

    Như từ hồi đầu năm đã chia sẻ, số lượng người truy cập vào trang blog của mình đang dần ít đi. Khi xem thống kê, lượng người dùng trong 6 tháng đầu năm 2025 đã giảm 30% so với cùng kì năm ngoái, 15% so với 6 tháng cuối năm 2024. Như vậy một sự thật là người dùng đang rời bỏ dần đi. Nguyên nhân do đâu?

    Mình nghĩ lý do lớn nhất là thói quen của người dùng đã thay đổi. Họ tìm thấy blog chủ yếu qua các công cụ tìm kiếm, trong đó lớn nhất là Google. Gần 1/2 số lượng người dùng quay trở lại blog mà không cần thông qua bước tìm kiếm. Đó là một tín hiệu đáng mừng nhưng vẫn không đủ để tăng lượng người dùng mới. Chưa kể giờ đây, Google đã ra mắt tính năng AI Search Labs - tức là AI hiển thị luôn nội dung tổng hợp khi người dùng tìm kiếm, điều đó càng khiến cho khả năng người dùng truy cập vào trang web thấp hơn. Một điều thú vị là khi Search Labs được giới thiệu, thì các bài viết bằng tiếng Anh đã soán ngôi trong bảng xếp hạng truy cập nhiều nhất.

    Một bài viết của mình thường rất dài, có khi lên đến cả 2000 chữ. Mà để viết ra được một bài như thế tốn nhiều thời gian. Nhiều bài viết ra chẳng có ai đọc là điều bình thường. Mình biết và chấp nhận vì không phải ai cũng gặp phải vấn đề đang nói đến. Viết đối với mình như một cách để rèn luyện sự kiên nhẫn và cả tư duy. Viết ra mà giúp được cả ai đó là một điều tuyệt vời.

    Vậy nên mình đang nghĩ sẽ tập trung vào nội dung ngắn và trung bình để viết được nhiều hơn. Nội dung dài chỉ khi muốn viết chi tiết hoặc đi sâu về một chủ đề nào đó. Nên là đang tìm cách thiết kế lại trang blog. Mọi người cùng chờ nha 😄

    » Xem thêm
  • CloudFlare đã giới thiệu tính năng pay per crawl để tính phí cho mỗi lần AI "cào" dữ liệu trên trang web của bạn. Là sao ta 🤔?

    Mục đích của SEO là giúp các công cụ tìm kiếm nhìn thấy trang web. Khi người dùng tìm kiếm nội dung mà có liên quan thì nó hiển thị trang web của bạn ra kết quả tìm kiếm. Điều này gần như là đôi bên cùng có lợi khi Google giúp nhiều người biết đến trang web hơn, còn Google thì được nhiều người dùng hơn.

    Bây giờ cuộc chơi với các AI Agents thì lại khác. AI Agents phải chủ động đi tìm kiếm nguồn thông tin và tiện thể "cào" luôn dữ liệu của bạn về, rồi xào nấu hay làm gì đó mà chúng ta cũng chẳng thể biết được. Vậy đây gần như là cuộc chơi chỉ mang lại lợi ích cho 1 bên 🤔!?

    Nước đi của CloudFlare là bắt AI Agents phải trả tiền cho mỗi lần lấy dữ liệu từ trang web của bạn. Nếu không trả tiền thì tôi không cho ông đọc dữ liệu của tôi. Kiểu vậy. Hãy chờ thêm một thời gian nữa xem sao 🤓.

    » Xem thêm

Vấn đề

Xin chào độc giả của 2coffee.dev, Kiến trúc Node.js là một chuỗi bài mà tôi đã viết cách đây từ rất lâu, từ những ngày đầu mới học viết blog. Trải qua ngần ấy thời gian, chuỗi bài viết này được rất nhiều người quan tâm. Song cách diễn đạt còn mơ hồ, chưa hợp thị hiếu, vì vậy ngày hôm nay tôi quyết định viết lại một số bài viết trong này nhằm mục đích diễn đạt tốt hơn và cập nhật thêm một vài thông tin mới.

Chuỗi bài viết này mang đến cho mọi người một cái nhìn tổng quan về mô hình kiến trúc của Node.js, về cách mà nó hoạt động. Qua đó giúp cho bạn đọc hiểu được cách Node.js thực hiện chương trình viết ra như thế nào. Từ đó biết cách tối ưu và tổ chức mã tốt hơn.

Dự kiến số lượng bài viết gồm có 4 bài. Nội dung trong mỗi phần đều có liên quan đến nhau vì thế bạn không nên bỏ qua bài viết nào, hãy đọc lần lượt theo thứ tự để theo dõi xuyên suốt. Ở bài viết đầu tiên, tôi sẽ điểm lại một chút thông tin về JavaScript, cùng với khái niệm cơ bản về Node.js. JavaScript thì có liên quan gì đến Node.js?

JavaScript

JavaScript không còn xa lạ với ai trong giới lập trình. JavaScript đang là bá chủ trên trình duyệt, là ngôn ngữ được sử dụng nhiều nhất để lập trình giao diện. Nhờ có nó mà chúng ta mới có trải nghiệm web phong phú như bây giờ. Rất nhiều trang web tập trung vào tương tác, trải nghiệm người dùng độc lạ nhằm thu hút sự chú ý của người dùng.

JavaScript được tạo trong 10 ngày bởi Brandan Eich, một nhân viên của Netscape, vào tháng 9 năm 1995. Được đặt tên đầu tiên là Mocha, tên của nó được đổi thành Mona rồi LiveScript trước khi thật sự trở thành JavaScript nổi tiếng như bây giờ.

Trong năm 1996, JavaScript được chính thức đặt tên là ECMAScript. ECMAScript 2 phát hành năm 1998 và ECMAScript 3 tiếp tục ra mắt vào năm 1999. Nó liên tục phát triển thành JavaScript ngày nay, giờ đã hoạt động trên hầu hết trình duyệt và trên các thiết bị từ di động đến máy tính để bàn. Tính đến năm 2016 đã có hơn 92% các website đều sử dụng JavaScript và nó hiện tại cũng đứng đầu trên Github về độ phổ biến của các dự án có sử dụng JavaScript.

JavaScript trong trình duyệt và JavaScript Runtime

JavaScript chỉ có thể chạy được khi trình duyệt hỗ trợ JavaScript. Điều đó có nghĩa trình duyệt là nơi quyết định thực thi mã JavaScript. Để làm được điều đó hầu hết trình duyệt ngày nay đều phải có một bộ phân giải và thực thi mã JavaScript được gọi là JavaScript Engine.

JavaScript Engine có vai trò chuyển đổi mã JavaScript thành mã máy. JavaScript Engine hoạt động như một trình thông dịch, nó bao gồm Memory Heap (lưu trữ các đối tượng như các biến, hàm) và Call Stack (để thực thi các hàm).

JavaScript Engine

Việc tự sản sinh hoặc chế tạo ra các Javascript Engine là tốn kém, đôi khi còn không phù hợp với nguồn lực sẵn có. Vì vậy trình duyệt thường lựa chọn tích hợp một một bộ Javascript Engine có sẵn, phù hợp với triết lý phát triển sản phẩm của họ.

Ví dụ Chrome sử dụng Javascript V8 Engine, Mozilla FireFox sử dụng SpiderMonkey Javascript Engine, Còn Microsoft Edge phiên bản cũ trước khi chưa dùng nhân Chromium thì sử dụng Chakra Javascript Engine.

Ngoài ra, trình duyệt còn cung cấp Web APIs cho phép mã JavaScript truy cập vào một số đối tượng như window, document. Chúng không phải là đặc tả của JavaScript. Chúng được trình duyệt tạo ra và cho phép JavaScript tương tác.

Chính vì trình duyệt sử dụng Javascript Engine khác nhau nên chúng có thể diễn giải mã JavaScript theo cách khác nhau. Điều này dẫn đến việc một số mã có thể mang lại những kết quả khác nhau. Đó cũng là minh chứng cho việc một trang web chạy rất tốt trên Chrome nhưng khi sang IE, Firefox... thì lại hoạt động một cách bất bình thường.

Vì thế, Ecma International đã đặt ra các quy tắc gọi tên các phiên bản JavaScript, cùng với nỗ lực chuẩn hoá JavaScript trong trình duyệt với hy vọng chúng không bị phân mảnh nữa. ES5 là phiên bản ECMAScript từ năm 2009 đến 2015, từ 2015 trở đi các phiên bản lần lượt là ES6 - 2015, ES7 - 2016... Mỗi năm hội đồng sẽ phê duyệt và phát hành các phiên bản tiếp theo. Tính đến thời điểm viết bài là 2021 đã có phiên bản ES12. Mỗi phiên bản đều có những cải tiến và những tính năng mới, tuy nhiên việc triển khai nó lại hoàn toàn phụ thuộc vào việc các đơn vị phát triển trình duyệt có hỗ trợ nó hay không.

Tóm lại, mặc dù có đặc tả đầy đủ nhưng việc tuân theo đặc tả hay không thì không... biết. Đó vẫn là một vấn đề gây nhức nhối cho đến tận ngày nay.

JavaScript và Node.js có liên quan gì với nhau?

JavaScript ban đầu là ngôn ngữ lập trình chủ yếu cho giao diện web phổ biến nhất trên thế giới. Nhận thấy tiềm năng của JavaScript, sẽ thế nào nếu như lập trình viên chỉ cần biết JavaScript cũng có thể lập trình máy chủ? Node.js được tạo ra với nỗ lực mang JavaScript về phát triển trong môi trường máy chủ.

2009, Ryan Dahl đã quyết định sử dụng Javascript Engine nhanh nhất - V8 của Chrome, làm cho nó hoạt động trong môi trường máy chủ, đặt tiền đề cho Node.js ra đời. Node.js sử dụng V8 Engine để diễn giải mã JavaScript thành mã máy. Vì Node.js được viết cho hệ điều hành chứ không phải trình duyệt, một số API Web cho trình duyệt như window, document không được triển khai trong Node.

Cũng cần lưu ý rằng Node.js không hỗ trợ tất cả các tính năng JavaScript (chuẩn ECMAScript) ngay lập tức mà phải thông qua các bản cập nhật. Điều đó đồng nghĩa với việc nếu muốn sử dụng tính năng của ES mới phải chờ đợi các bản cập nhật.

Tóm lại, Node.js cung cấp một môi trường chạy mã JavaScript bên ngoài trình duyệt.

Bạn đọc tham khảo thêm bài viết hướng dẫn cài đặt Node.js Cài đặt node.js, chạy ứng dụng node.js đầu tiên.

Node.js có phải là ngôn ngữ lập trình?

Không! Node.js chỉ là một môi trường chạy mã JavaScript. Bởi vì thực tế, Node chỉ cung cấp môi trường chạy mã JavaScript thông qua V8 Engine của Chrome.

Dưới đây là một vài kết luận về Node.js.

  • Node.js không phải là một ngôn ngữ lập trình.
  • Node.js không phải là Framework cho ứng dụng máy chủ, nó là nền tảng.
  • Node.js cung cấp môi trường chạy mã JavaScript phía máy chủ.

Node.js được cấu tạo từ nhiều thành phần kết nối với nhau tạo ra một môi trường hoàn hảo. Dưới đây là sơ đồ mô tả kiến trúc Node.js:

Mô hình kiến trúc

Các thành phần được mô tả như sau:

  • V8: Đây là bộ Engine V8 của Chrome, bao gồm Memory Heap, Call Stack, Garbage Collector và chuyển đổi mã JavaScript thành mã máy của hệ điều hành.
  • Libuv: Là một thư viện quan trọng, bao gồm Thread Pool và Event Loop, Event Queue. Nó là thư viện C đa nền tảng tập trung vào các tác vụ I/O không đồng bộ.
  • Node.js Standard Library: Bao gồm các thư viện, các chức năng liên quan đến hệ điều hành cho Timers như setTimeout , File system như fs, Network Calls như http.
  • llhttp: Phân tích request/response HTTP (trước đây là http-parse).
  • c-ares: Thư viện C cho DNS không đồng bộ được sử dụng trong dns module.
  • open-ssl: Các chức năng mã hóa được sử dụng trong TLS (SSL), crypto module.
  • zlib: Nén và giải nén bằng cách chạy đồng bộ, không đồng bộ và streaming.
  • Node.js API: Cung cấp JavaScript API được sử dụng bởi các ứng dụng.

Kết luận

Node.js không phải là một ngôn ngữ lập trình mà là một môi trường chạy mã JavaScript phía máy chủ, được xây dựng dựa trên JavaScript V8 Engine của Chrome. Với khả năng chuyển đổi mã JavaScript thành mã máy và cung cấp các API riêng biệt, Node.js giúp lập trình viên mở rộng phạm vi sử dụng JavaScript ra ngoài trình duyệt, tạo điều kiện cho việc phát triển các ứng dụng máy chủ hiện đại. Kiến trúc của Node.js được tạo thành từ nhiều thành phần quan trọng như V8, Libuv, Node.js Standard Library, llhttp, c-ares, open-ssl, và zlib, mỗi thành phần đảm nhận những nhiệm vụ cụ thể để đảm bảo hiệu suất và tính linh hoạt. Đặc biệt, Libuv đóng vai trò cốt lõi với Event Loop và Thread Pool, giúp Node.js xử lý các tác vụ I/O không đồng bộ một cách hiệu quả.

Đây mới chỉ là phần mở đầu, và các phần tiếp theo trong chuỗi bài viết sẽ đi sâu hơn vào cách các thành phần của Node.js tương tác để tạo ra một hệ thống hoàn chỉnh. Hãy tiếp tục theo dõi để khám phá chi tiết hơn về công nghệ mạnh mẽ này nhé.

Tham khảo:

Cao cấp
Hello

Tôi & khao khát "chơi chữ"

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (0)

Nội dung bình luận...