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
  • Từ lâu rồi suy nghĩ làm thế nào để tăng sự hiện diện thương hiệu, cũng như người dùng cho blog. Nghĩ đi nghĩ lại thì chỉ có cách chia sẻ lên mạng xã hội hoặc trông chờ họ tìm kiếm, cho đến khi...

    In cái áo này được cái tắc đường khỏi phải lăn tăn, càng đông càng vui vì hàng trăm con mắt nhìn thấy cơ mà 🤓

    (Có tác dụng thật nha 🤭)

    » Xem thêm
  • Một vòng của sự phát triển nhiều dự án khá là thú vị. Tóm tắt lại trong 3 bước: Thấy một cái gì đó phức tạp -> Làm cho nó đơn giản đi -> Thêm thắt tính năng cho đến khi nó phức tạp... -> Quay trở lại vòng lặp mới.

    Tại sao lại như vậy? Để mình lấy 2 ví dụ cho các bạn thấy.

    Markdown ra đời với mục tiêu tạo ra một định dạng văn bản thô "dễ viết, dễ đọc, dễ dàng chuyển thành một dạng gì đó như HTML". Vì thời đó chẳng ai đủ kiên nhẫn mà vừa ngồi viết vừa thêm định dạng cho văn bản hiển thị ở trên web như thế nào. Ấy vậy mà giờ đây người ta đang "nhồi nhét" hoặc tạo ra các biến thể dựa trên markdown để bổ sung thêm nhiều định dạng mới đến mức... chẳng nhớ nổi hết cú pháp.

    React cũng là một ví dụ. Từ thời PHP, việc khát khao tạo ra một cái gì đó tách biệt hẳn giao diện người dùng và phần xử lý logic chính của ứng dụng thành 2 phần riêng biệt cho dễ đọc, dễ viết. Kết quả là các thư viện UI/UX phát triển rất mạnh mẽ, mang lại khả năng tương tác với người dùng rất tốt, còn phần logic ứng dụng thì nằm ở một máy chủ riêng biệt. Bộ đôi Front-end, Back-end cũng từ đấy mà thịnh hành, không thể thiếu anh bồi bàn REST API. Ấy vậy mà giờ đây React trông cũng không khác biệt gì so với PHP là mấy, kéo theo là cả Vue, Svelte... lại cùng quy tất cả về một mối.

    Cơ mà không phải vòng lặp là xấu, ngược lại vòng lặp này mang tính tiến hoá nhiều hơn là "cải lùi". Nhiều khi lại tạo ra được cái hay hơi cái cũ thế là người ta lại dựa trên cái hay đó để tiếp tục lặp. Nói cách khác là chắc lọc tinh hoa từng tí một tí một á 😁

    » Xem thêm
  • Song song với các dự án chính thức thì thi thoảng mình vẫn thấy các dự án "bên lề" nhằm tối ưu hoặc cải tiến ngôn ngữ theo khía cạnh nào đó. Ví dụ nature-lang/nature là một dự án hướng tới cải tiến Go, mang lại một số thay đổi nhằm giúp cho việc sử dụng Go trở nên thân thiện hơn.

    Nhìn lại mới thấy hao hao JavaScript 😆

    » 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

Bí mật ngăn xếp của Blog

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào 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...