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 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 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).
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 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.
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 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:
Các thành phần được mô tả như sau:
setTimeout
, File system như fs
, Network Calls như http
.dns
module.crypto
module.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:
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!
Đăng ký nhận thông báo bài viết mới
Bình luận (0)