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 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 đượ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).
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 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.
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 đượ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:
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.
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.
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ình luận (0)