Nodejs là thông dịch hay biên dịch
Node.js được xây dựng dựa trên JavaScript runtime. Nghe thật tuyệt, nhưng mà nó có nghĩa là gì? Nó hoạt động như thế nào? Show Nền tảng Node runtime bao gồm mọi thứ mà bạn cần để hoàn thành một chương trình viết bằng JavaScript. Nếu bạn đã biết Java là gì, thì định nghĩa Node.js là gì cũng có một số điểm giống nhau. NodeJS là một nền tảng được xây dựng trên “V8 Javascript engine” được viết bằng c++ và Javascript. Nền tảng này được phát triển bởi Ryan Lienhart Dahl vào năm 2009. Node.js ra đời khi các developer đời đầu của JavaScript mở rộng nó từ một thứ bạn chỉ chạy được trên trình duyệt thành một thứ bạn có thể chạy trên máy của mình dưới dạng ứng dụng độc lập. Giờ đây bạn có thể làm được nhiều thứ với JavaScript hơn là chỉ tương tác với các website.
Cả trình duyệt JavaScript và Node.js đều chạy trên JavaScript runtime V8 engine. Công cụ này lấy code JavaScript của bạn và convert nó sang mã máy (bytecode) cho việc thực thi nhanh hơn. Mã máy là loại code thấp cấp hơn để máy tính có thể chạy mà không cần biên dịch nó. Tại sao lại là Node.js?Đây là định nghĩa chính thức trên trang web chính của Node.js:
Chúng ta đã khá quen với dòng đầu trong định nghĩa này rồi. Nên giờ hãy nói về 2 dòng còn lại để hiểu được tại sao Node.js lại phổ biến đến vậy nhé. I/O là Input/Output. Nó có thể là bất cứ thứ gì từ đọc/viết các file nội bộ cho đến tạo HTTP đến API. I/O tốn thời gian và do đó nó sẽ chặn các chức năng khác. Xét một tình huống là chúng ta cần dữ liệu backend chi tiết cho user1 và user2 và sau đó hiển thị chúng trên màn hình hoặc bảng điều khiển. Để phản hồi cho lệnh này sẽ mất thời gian, nhưng cả 2 dữ liệu user có thể thực hiện độc lập và cùng lúc. Blocking I/O (trái) và Non-Blocking I/O (phải) Blocking I/OTrong phương thức blocking, dữ liệu của user2 sẽ không bắt đầu cho đến khi dữ liệu của user1 xuất trên màn hình. Nếu đây là một server web, chúng ta phải bắt đầu một thread mới cho từng user mới. Nhưng JavaScript là đơn luồng (tính chất “xong cái này mới đến cái khác”). Và điều này làm JavaScript không phù hợp cho các tác vụ đa luồng. Đó là lý do non-blocking xuất hiện. Non-blocking I/OMặt khác, sử dụng request non-blocking, bạn có thể request dữ liệu cho user2 mà không phải đợi phản hồi request từ user1. Bạn có thể bắt đầu cả 2 request song song. Non-blocking I/O loại bỏ nhu cầu đa luồng vì server có thể xử lý nhiều request cùng một lúc. JavaScript Event LoopNếu bạn có 26 phút rảnh, hãy xem qua video xuất sắc này giải thích Vòng lặp sự kiện Node là gì: Còn nếu bạn không rảnh thì đây là giải thích từng bước nhanh gọn về cách JavaScript Event Loop hoạt động. npmĐây là những thư viện được tạo nên bởi 1 cộng đồng tuyệt vời mà sẽ giải quyết được hầu hết các vấn đề chung của bạn. npm (Node Package Manager) có những phiên bản bạn có thể sử dụng trong app để lập trình nhanh và hiệu quả hơn. RequireRequire làm 3 thứ:
Require là 1 chức năng, và nó nhận tham số path tinh chỉnh và trả về Node ModulesModule Node là 1 block code có thể tái sử dụng mà sự tồn tại của nó không vô tình ảnh hưởng đến các code khác. Bạn có thể tạo module của riêng mình và sử dụng nó với nhiều ứng dụng khác nhau. Node.js có 1 bộ built-in module bạn có thể sử dụng mà không cần cài đặt thêm gì nữa. V8 turbo-charges JavaScript bằng cách tận dụng C++V8 là một công cụ runtime nguồn mở được viết bằng C++. JavaScript -> V8(C++) -> Machine Code V8 thực hiện một tệp lệnh gọi là ECMAScript như được chỉ định trong ECMA-262. ECMAScript được tạo ra bởi Ecma International để chuẩn hoá JavaScript.
Về cơ bản việc này cho phép bạn thêm các tính năng vào JavaScript bằng cách nhúng V8 vào code C++ để code C++ của bạn có thể hiểu hơn những gì ECMAScript chỉ định. P/s: Như Greg Bulmash đã nói tới, có nhiều công cụ runtime JavaScript ngoài V8 của Chrome như SpiderMonkey của Mozilla, Chakra của Microsoft,v.v… |