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
  • Manus đã chính thức mở cửa cho tất cả người dùng rồi đấy mọi người. Cho những ai chưa biết thì đây là một công cụ viết báo cáo (làm mưa làm gió) giống như Deep Research của OpenAI á. Mỗi ngày được miễn phí 300 Credits để nghiên cứu. Mỗi lượt nghiên cứu tiêu tốn tuỳ thuộc vào độ phức tạp của yêu cầu. À với cả họ đang có chương trình tặng miễn phí Credits hay sao á. Như mình thì vào thấy được hẳn 2000.

    Mình dùng thử, so sánh với cùng một lệnh giống như đợt trước dùng bên Deep Research thì nội dung khác biệt nhau hoàn toàn. Manus báo cáo như kiểu viết văn hơn so với OpenAI là các gạch đầu dòng và bảng biểu.

    À lúc đăng ký xong có bắt nhập số điện thoại để xác minh, nếu lỗi thì các bạn đợi qua ngày thử lại xem có được không nhé.

    » Xem thêm
  • Mọi người chắc nghe nhiều về xu hướng tìm kiếm thông tin bằng AI chứ không cần công cụ tìm kiếm như Google nữa rồi đúng không? Không đâu xa ánh xạ vào bản thân thì thấy đúng thật, thi thoảng mới tìm kiếm thôi chứ còn đâu toàn hỏi tụi AI.

    Ngay từ đầu viết blog, thứ mà mình hướng đến là chia sẻ kinh nghiệm chứ không phải là những bài mang nặng tính kỹ thuật, máy móc, hướng dẫn từ đầu... Vì thời điểm đó đã có quá nhiều người làm nội dung này rồi và họ làm rất tốt, tại sao mình phải cố phát minh lại bánh xe? Một điều nữa là tin tưởng độc giả của mình có khả năng tìm hiểu vấn đề. Nếu bạn đọc đủ nhiều các bài viết trên blog thì thấy mình luôn cố gắng chèn thêm các liên kết tham khảo ngoài bài viết, nêu ra vấn đề mở và rất ít khi kết luận chắc chắn một điều gì đó.

    Mình đã cố gắng rèn luyện kỹ năng viết, kỹ năng trình bày và cả cách tương tác với độc giả để mang lại giá trị cho họ. Nhiều lúc ngồi lật lại các con số thống kê thấy lượng đọc bài viết tăng lên lại cảm thấy vui. Nhưng khi nguồn truy cập đến từ Google thì lại thấy buồn, vì điều đó chứng tỏ họ biết đến mình chỉ khi đang cố đi tìm giải pháp, có thể họ chỉ đọc chớp nhoáng, may ra tìm được cách giải quyết và thế là đóng cửa sổ trình duyệt rồi đi như một cơn gió.

    Chừng vài tháng đổ lại đây, một điều khiến mình rất vui đó là lượng người truy cập thẳng vào trang chủ mà không thông qua công cụ tìm kiếm đang tăng dần lên, có nhiều hôm lượng truy cập tự nhiên còn cao hơn cả đến từ Google. Điều đó chứng tỏ độc giả đã có thói quen quay lại trang của mình nhiều hơn và họ tìm thấy được giá trị từ blog mang lại. Vui mừng khôn xiết 🤩

    Bên cạnh đó thì lượng truy cập vào chuyên mục Threads - tức là mục mình đang viết bài này đang cao hơn bao giờ hết. Điều đó chứng tỏ xu hướng đi theo tin nhanh là đúng đắn. Mình có thể ngồi cả ngày để viết tin ngắn cho bạn đọc vì nó rất nhanh mà tiện, không tốn công đi tìm tài liệu để viết, không tốn cả thời gian viết nữa, còn mình thì có rất nhiều thứ để chia sẻ 😅. Nhưng không vì thế mà bỏ bê các bài viết dài, vì dài thì có nhiều thông tin để chia sẻ hơn.

    Vài lời tâm sự thế thôi chứ hơn một tháng nay mình chưa viết bài viết mới nào vì công việc bận quá. Xong lâu dần cứ trì hoãn lại thành lười. À với cả tháng 5 này rất thích hợp để đọc các cuốn sách về cách mạng á. Có hôm đọc đến 2 giờ sáng mới đi ngủ 🥱

    » Xem thêm
  • Mình mới nhìn thấy một trang web khá thú vị nói về các cột mốc đáng nhớ trong lịch sử phát triển Internet toàn cầu: Internet Artifacts

    Chỉ từ 1977 - khi Internet còn nằm trong hộp thí nghiệm thì nhìn xem - giờ đây Internet đã khiến mọi thứ phát triển đến mức nào 🫣

    » 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...