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

Những mẩu tin ngắn hàng ngày dành cho bạn
  • Đây! Một vấn đề mà từ xưa đến nay mình cứ thắc mắc mãi, và cho đến hôm qua thì mọi thứ đã sáng tỏ.

    Bình thường mọi người dùng height: 100vh để đặt chiều cao bằng với viewport của màn hình. Trên máy tính thì không vấn đề gì, thậm chí giả lập kích thước của điện thoại thông minh thì mọi thứ vẩn ổn. Nhưng khi mở trên điện thoại thì height 100vh lúc nào cũng vượt quá viewport. Ủa!? Là sao???

    Lý giải cho điều này là do trên thiết bị di động có cách tính viewport khác với máy tính. Nó thường bị can thiệp hay ảnh hưởng bởi thanh địa chỉ, thanh điều hướng của nền tảng mà bạn đang sử dụng. Vậy nên nếu muốn 100vh trên di động đúng bằng viewport thì cần phải làm thêm một bước thiết lập lại viewport.

    Dễ lắm, đầu tiên cần tạo một css variable --vh ở ngay thẻ script đầu trang.

    function updateViewportHeight() { const viewportHeight = globalThis.innerHeight; document.documentElement.style.setProperty('--vh', `${viewportHeight * 0.01}px`); } updateViewportHeight(); window.addEventListener('resize', updateViewportHeight);

    Sau đó thay vì dùng height: 100vh thì chuyển thành height: calc(var(--vh, 1vh) * 100). Thế là xong.

    » Xem thêm
  • Cả ngày hôm nay mình dành thời gian để làm giao diện tiếp thị cho gói hội viên của 2coffee.dev. Vậy là cuối cùng thì cũng chính thức đi vào vào con đường mà 5 năm trước cũng không ngờ đến được: "Bán một cái gì đó". Người ta thường nói "Cho đi để nhận lại", bên cạnh đó cũng có câu "Nếu giỏi một cái gì đó, đừng làm nó miễn phí". Nếu theo dõi đủ lâu, bạn đọc sẽ thấy chẳng có gì mình giấu giếm. Biết gì viết nấy, và đôi khi nhờ viết ra mà nhận lại được sự góp ý của độc giả. Từ đó giúp mình hoàn thiện bản thân nhiều hơn.

    Membership là tính năng mà mình sắp sửa giới thiệu. Trở thành hội viên của blog, bạn sẽ có một số đặc quyền nhất định, ví dụ như truy cập vào các bài viết chỉ dành riêng cho hội viên. Các bài viết này về các chủ đề chuyên sâu và được hệ thống hoá sao cho dễ đọc và dễ nắm bắt nhất. Qua đó cung cấp thêm nhiều kiến thức và trau dồi kỹ năng cho bạn đọc.

    Để đạt được đến ngày hôm nay là công rất lớn của các bạn đọc giả, của những người yêu mến 2coffee.dev. Nhờ các bạn mà blog mới có ngày hôm nay. Bên cạnh đó, bản thân mình cũng phải thay đổi liên tục, phải vượt ra khỏi vùng an toàn, làm những điều mà trước nay không dám. Dù sao đi nữa thì đây cũng mới là khởi đầu cho mọi sự gian nan. Nhưng đừng bao giờ nản nha các bạn ơi 😄

    » Xem thêm
  • Ngày nay, 1 triệu (1M) tác vụ đồng thời sẽ tiêu tốn bao nhiêu bộ nhớ? Đó là câu hỏi của hez2010 và anh đã quyết định đi tìm câu trả lời, bằng cách thử nghiệm một chương trình đơn giản trên nhiều ngôn ngữ lập trình khác nhau: How Much Memory Do You Need in 2024 to Run 1 Million Concurrent Tasks?

    Tóm tắt lại thì Rust vẫn vô đối, nhưng vị trí thứ 2 mới làm tôi cảm thấy ngạc nhiên 😳

    » Xem thêm

Vấn đề

Series bài viết này hy vọng sẽ 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 đó phần nào giúp cho bạn đọc hiểu được chương trình được thực như thế nào với Node. Bạn sẽ biết cách viết và tổ chức mã tối ưu hơn.

Dự kiến số lượng bài viết trong chủ đề này sẽ bao gồm 4 bài đi từ cơ bản đến nâng cao. 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 một phần nào, hãy theo dõi nội dung lần lượt theo thứ tự để nội dung được xuyên suốt.

Xem thêm các bài viết trong series này:

Ở bài viết đầu tiên, tôi sẽ nói về ngôn ngữ JavaScript cùng các khái niệm cơ bản của Node.js. Tại sao JavaScript lại liên quan đến Node.js? Hãy cùng nhau tìm hiểu nhé.

Javascript

Javascript hẳn không còn quá xa lạ với những người trong giới lập trình. Nó hiện tại đang là bá chủ trên các trình duyệt web, là ngôn ngữ được sử dụng rất nhiều để lập trình front-end. Nhờ nó mà các lập trình viên mới tạo ra được website tối ưu hóa các trải nghiệm của người dùng.

JavaScript được tạo trong mười 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 khắp mọi trình duyệt và trên khắp các thiết bị từ di động đến máy tính bàn.

Tính đến năng 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 project có sử dụng JavaScript.

Javascript trên trình duyệt & Javascript Runtime

JavaScript được sử dụng phổ biến trong lập trình website, khiến chúng trở nên linh động và có tính tương tác tốt. Do đó mã JavaScript sẽ phụ thuộc vào việc được các trình duyệt hỗ trợ thực thi và điều này được thực hiện bởi JavaScript Engine.

JavaScript Engine được sử dụng để 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

Hầu hết các trình duyệt hiện đại hiện nay sử dụng Javascript Runtime bằng cách sử dụng các Javascript Engine hỗ trợ chuyển đổi mã Javascript và thực thi. Các trình duyệt khác nhau sẽ sử dụng các Javascript Engine khác nhau.

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.

Trình duyệt cũng cung cấp Web APIs cho phép mã Javascript truy cập vào một số đối tượng như window, document mà chúng không phải là "core" của JavaScript. Hiểu đơn giản, DOM là của trình duyệt còn JavaScript thì không.

Chính vì mỗi trình duyệt sử dụng một 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 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 sang đến IE, Firefox... thì lại hoạt động một cách bất bình thường.

Chính vì thế, từ năm 2016 - Ecma International (hiểu nôm na là đơn vị quản lý tiêu chuẩn của ngôn ngữ Javascript) đã đặt ra cách quy tắc gọi tên các phiên bản Javascript. 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 ES. 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.

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

JavaScript ban đầu là ngôn ngữ lập trình front-end, được biết đến như một trong những ngôn ngữ lập trình phổ biến nhất trên thế giới. Node.js được tạo ra với một nỗ lực là mang Javascript về phát triển trên 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 mà không cần trình duyệt, đặt tiền đề cho Node.js ra đời. Mã của V8 được viết bằng C++ giúp nó có thể thực thi trực tiếp trên hệ điều hành.

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, bạn phải chờ đợi Node.js tung ra 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 có thể 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.

Thế thì Node.js có phải là một 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à một 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 gồm có 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

Trong đó 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

Nội dung trên trong bài viết cung cấp khái niệm cơ bản về JavaScript, JavaScript Runtime, JavaScript Engine, về việc tại sao lại có những trang web tương thích rất tốt với trình duyệt này nhưng lại "tệ hại" trên trình duyệt khác, về khái niệm của Node.js và cả thành phần trong mô hình kiến trúc của Node.

Về cơ bản, Node.js được cấu tạo từ nhiều phần nhỏ. Vậy thì cách mà các thành phần đó hoạt động, liên kết với nhau như thế nào? Hãy xem tiếp Phần 2 của loạt series Kiến trúc Node.js trên 2COFFEE.DEV.

Cao cấp
Hello

5 bài học sâu sắc

Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? Hãy bấm vào ngay!

Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? 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.
Author

Xin chào, tôi tên là Hoài - một anh Dev kể chuyện bằng cách viết ✍️ và làm sản phẩm 🚀. Với nhiều năm kinh nghiệm lập trình, tôi đã đóng góp một phần công sức cho nhiều sản phẩm mang lại giá trị cho người dùng tại nơi đang làm việc, cũng như cho chính bản thân. Sở thích của tôi là đọc, viết, nghiên cứu... Tôi tạo ra trang Blog này với sứ mệnh mang đến những bài viết chất lượng cho độc giả của 2coffee.dev.Hãy theo dõi tôi qua các kênh LinkedIn, Facebook, Instagram, Telegram.

Bạn thấy bài viết này có ích?
Không

Bình luận (0)

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