Tổng quan về Node.js
Những khái niệm, cách thức hoạt động và bản chất của Node.js.
Theo một cuộc khảo sát trên trang Stack Overflow về những framework, thư viện và công cụ được sử dụng nhiều nhất năm 2020, Node.js đã dành được vị trí số một với 51.4% trong tổng số hơn 40.000 phản hồi. Cũng theo một cuộc khảo sát khác cùng năm trên trang State of JS thì có đến 91.8% trong tổng số gần 21.000 người được khảo sát sử dụng Node.js.
Vậy Node.js có gì hay mà người người nhà nhà đều đổ xô dùng em nó vậy? Trong bài viết này chúng ta sẽ cùng tìm hiểu về các khái niệm liên quan cũng như cách thức vận hành của Node.js để giải đáp thắc mắc này nha!
Node.js là gì?
Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine.
Theo định nghĩa từ trang chủ của Node.js thì Node.js là một JavaScript runtime sử dụng engine JavaScript V8 được phát triển bởi Google. Đây cũng là engine tích hợp sẵn trong trình duyệt Chrome. Node.js sử dụng mô hình event-driven, non-blocking I/O khiến nó trở nên nhẹ, hiệu quả và có tốc độ xử lý cao.
Nói sơ về V8 thì nó là một engine JavaScript mã nguồn mở viết bằng C++, được phát hành cùng thời điểm với phiên bản đầu tiên của trình duyệt Chrome (02.09.2008). V8 biên dịch trực tiếp JavaScript thành machine code thay vì sử dụng interpreter để chạy bytecode theo cách truyền thống. Chúng ta sẽ cùng tìm hiểu những cơ chế này ở phần sau của bài viết.
Cái tên V8 được lấy cảm hứng từ những những động cơ ô tô đốt trong - mạnh mẽ, sản sinh công suất lớn với thiết kế 8 xi lanh sắp xếp hình chữ V. Rất có thể các kỹ sư của Google là người chơi hệ xe, bởi họ lại tiếp tục đặt tên cho các thành phần khác trong "động cơ" V8 của mình là Crankshaft, TuborFan và Ignition.
Ngoài V8 của Google ra thì mỗi trình duyệt lại sử dụng một engine JavaScript của riêng nó, ví dụ như là Firefox của Mozilla sử dụng SpiderMonkey, Edge của Microsoft thì sử dụng Chakra, Safari của Apple lại sử dụng JavaScriptCore (cũng có thể gọi là Nitro), v.v...
JavaScript engine
Hiểu nôm na thì JavaScript engine là một chương trình thực thi mã JavaScript. Ban đầu JavaScript engine chỉ đơn thuần là một interpreter, nhưng đối với engine hiện nay đều sử dụng JIT compilation nhằm cải thiện vấn đề hiệu suất.
Interpreter và Compiler
- Interpreter hay trình thông dịch là một chương trình sẽ trực tiếp thực thi mã lệnh của một ngôn ngữ lập trình mà không yêu cầu phải biên dịch trước thành machine code hay mã máy.
- Compiler hay trình biên dịch là một chương trình thực hiện việc dịch mã lệnh từ một ngôn ngữ lập trình (source language hay ngôn ngữ nguồn), thông thường là các ngôn ngữ bậc cao, sang một ngôn ngữ lập trình khác (target language hay ngôn ngữ đích) có bậc thấp hơn, điển hình như là machine code, để tạo ra một chương trình có thể thực thi được.
Do thời gian biên dịch thường không nhỏ, nên để giải quyết được vấn đề này thì có một cách là không dịch trực tiếp source code sang machine code mà sẽ dịch sang một ngôn ngữ trung gian khác, thường là bytecode. Đặc điểm của hướng giải quyết này là thời gian để biên dịch từ source code sang bytecode nhanh hơn so với sang machine code, tốc độ thực thi nhanh hơn source code nhưng lại chậm hơn so với machine code.
AOT và JIT compilation
- AOT (viết tắt của ahead-of-time, không phải Attack on Titan đâu nha) compilation: là quá trình biên dịch toàn bộ source code trước khi bắt đầu chạy chương trình.
- JIT (viết tắt của just-in-time) compilation: còn được gọi là dynamic translation hay runtime compilation, là quá quá trình biên dịch source code tại runtime hay trong thời gian thực thi chương trình.
Ta có thể kết hợp interpreter và compiler để trở thành engine của một ngôn ngữ theo 1 trong 2 cách sau:
- AOT kết hợp interpreter: source code được biên dịch toàn bộ thành machine code hoặc bytecode trước, sau đó mới sử dụng một interpreter để thực thi chương trình.
- JIT kết hợp interpreter: sử dụng interpreter để khởi chạy chuơng trình trước, sau đó mới dùng JIT compiler để dịch và thay thế source code bằng mã nguồn mới đã được biên dịch.
Các môi trường runtime
Đây là nơi mà JavaScript được thực thi. Mỗi môi trường sẽ cung cấp các global object hay đối tượng toàn cục cụ thể mà chương trình của chúng ta có thể truy cập được, việc này cũng ảnh hưởng đến cách mà chương trình chạy.
JavaScript có hai môi trường runtime, các trình duyệt web và như đã nhắc đến đầu bài viết thì không ai khác ngoài nhân vật chính của chúng ta, Node.js.
Môi trường runtime của trình duyệt web
Trình duyệt web là môi trường mà JavaScript thường được thực thi nhất. Các đoạn mã JavaScript được nhúng vào trang web thông qua cặp thẻ <script></script>
sẽ được thực thi khi trang web đã được tải lên hoàn toàn. Những ứng dụng chạy trên môi trường này được gọi là các ứng dụng front-end.
Môi trường runtime Node.js
Trrước đây khi muốn viết các ứng dụng back-end có thể chạy mà không cần trình duyệt, ta phải sử dụng các ngôn ngữ khác như là PHP, Java, C#, ... Nhưng may mắn thay, nhờ có sự ra đời của Node.js mà chúng ta đã có thể làm được điều đó, từ đó giúp ta có thể viết những ứng dụng full-stack (front-end và back-end) mà chỉ sử dụng ngôn ngữ JavaScript.
Tổng kết
Trên đây chỉ đơn giản là bề nổi của tảng băng chìm Node.js mà ta có thể nhìn thấy được. Vẫn còn rất nhiều điều chúng ta có thể khám phá thêm về JavaScript engine này.
Hy vọng với những thông tin trên có thể giúp các bạn phần nào hiểu rõ hơn bản chất của Node.js, cách thức mà nó hoạt động, cũng như khai phá được một mảng kiến thức mà rất có thể sẽ giúp ích trên con đường lập trình của các bạn sau này.