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
  • Mình mới tìm thấy một công cụ trích xuất nội dung từ image, pdf, docx, xlsx, pptx... sang dạng text, markdown, hay là json... Nói chung là nó hỗ trợ kha khá đầu vào và đầu ra. Lấy được nội dung ra rồi thì muốn làm gì thì làm, đặc biệt là bỏ vào trong các mô hình ngôn ngữ lớn để làm nguồn dữ liệu gì còn gì bằng 😁

    Công cụ tên là Docling, viết bằng python. Có thể nhúng vào trong mã hoặc dùng CLI đều được. Mình đã thử với dạng ảnh và pdf. Nhìn chung thì pdf vẫn cho kết quả tốt hơn. Ảnh thì hên xui 😅. Nó còn cho lựa chọn cả thư viện OCR á. Cái nào phù hợp hơn thì chọn.

    Quá trình cài thì phát sinh mấy lỗi. Mọi người nhớ dùng python 3.9 -> 3.12. Nếu bị lỗi ModuleNotFoundError: No module named '_lzma' thì thử làm theo hướng dẫn này xem giải quyết được không nhé ModuleNotFoundError: No module named '_lzma'

    » Xem thêm
  • Giá như mình biết đến kho lưu trữ này sớm hơn. github/opensource.guide là nơi hướng dẫn mọi người tất tần tật về Open Source. Từ làm thế nào để đóng góp mã, làm thế nào để bắt đầu một dự án mã nguồn mở của riêng, cho đến những kiến thức mà bất kỳ ai cũng nên biết khi mới bước chân vào 🤓

    Đặc biệt hàng này chính chủ từ Github luôn á.

    » Xem thêm
  • Hôm trước mới nhắc đến dokploy.com thì hôm nay lại có tiếp coolify.io - cũng là một dự án mã nguồn mở có khả năng thay thế Heroku/Netlify/Vercel. Theo như mình đọc thì Coolify hoạt động dựa trên triển khai Docker, nhờ đó mà nó có thể chạy được hầu hết các ứng dụng. Coolify cung cấp giao diện và tính năng để việc triển khai ứng dụng trở nên đơn giản và dễ dàng hơn.

    Có khi nào đây sẽ là xu hướng triển khai ứng dụng trong tương lai không? 🤔

    » 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

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...
Bấm hoặc cuộn mạnh để sang bài mới