Chính xác thì node.js là gì?

Node.js là nền tảng môi trường để thực thi các câu lệnh được viết bằng ngôn ngữ web javascript. Nghe đến đây thì có lẽ bạn sẽ rối vì không phải chỉ cần có trình duyệt thì javascript chạy được hay sao. Tương tự như Java Virtual Machine, Node.js cung cấp môi trường thực thi cho ngôn ngữ javascript trên các thiết bị có thể cài đặt được nó.

So sánh Java Virtual Machine và Node.js

So sánh Java Virtual Machine và Node.js

Node.js được lên ý tưởng bởi các nhà phát triển javascript họ muốn có một cái gì đó giúp cho javascript từ có thể build được các ứng dụng chạy được trên trình duyệt chuyển sang có thể chạy được trên các hệ máy khác như một ứng dụng độc lập. Từ đó biến Javascript thành một ngôn ngữ độc lập có thể build được các ứng dụng khác không chỉ còn gói gọn trong việc tương tác trên web.

Nhờ có node.js mà giờ đây Javascript đã trở thành một ngôn ngữ kịch bản mạnh mẽ và có thể làm bất cứ thứ gì mà một ngôn ngữ kịch bản như Python có thể làm.

Tương tự như trên các trình duyệt web hiện nay, Node.js được build dựa trên kiến trúc bộ giải mã V8 JavaScript runtime engine. Bằng cách chuyển toàn bộ các mã javascript thành các dòng mã máy, việc thực thi lệnh javascript bằng cách này sẽ khiến các đoạn code được thi hành nhanh hơn, ít chiếm tài nguyên và kết quả là ứng dụng mượt mà giảm thời gian trễ hơn.

Tại sao phải sử dụng node,js

Để tìm hiểu tại sao phải chuyển javascript thành ngôn ngữ kịch bản và lý do người ta cần node.js hãy cùng xem lại giới thiệu về node.js trên trang chủ của Node.js

Node.js là một runtime javascript được xây dựng dựa trên JavaScript EngineV8 của Chrome. Node.js sử dụng mô hình I/O và được phát triển dựa trên kiến trúc event-driven (cơ chế hường sự kiện) điều này khác hẳn với kiến trúc thường thấy, giúp cho Node.js không bị block non-blocking, gọn nhẹ và linh hoạt.

Cùng với Node.js chúng ta có thêm npm hệ quản lý các gói thư viện phụ trợ được viết riêng cho nền tảng này, được xem là hệ sinh thái  thư viện mã nguồn mở lớn nhất trên thế giới, với nó bạn sẽ không khó khăn gì khi cần thêm một tính năng mới vào ứng dụng đang phát triển.

Node.js® là một thời gian chạy JavaScript được xây dựng trên JavaScript EngineV8 của Chrome.” Bây giờ chúng ta hãy tìm hiểu mô hình blocking I/O và lý do tại sao Node.js lại được sử dụng rộng rãi đến vậy.

Trước hết I/O là khái niệm để cập đến việc truy xuất các cổng thông tin nhập xuất trên một hệ thống máy tính. Nó có thể là bất kì một tác vụ nào đó mà máy tính cần làm, cần truy xuất ví dụ như: đọc tập tin, di chuyển các file đến việc phúc đáp các request http được yêu cầu từ máy client. I/O là các tác vụ rất mất thời gian, và máy tính chỉ có thể phân bố nhất định một số tài nguyên cho vấn đề này, do đó nó khiến cho ứng dụng phải chở đợi phải tốn time chờ đợi phản hồi.

Để làm rõ hơn việc định nghĩa phía trên chúng ta cùng xem xét một kịch bản với yêu gầu sau: lấy thông tin từ cơ sở dữ liệu cho 2 thành viên và in các thông tin đó lên màn hình máy tính.

Block I/o bên trái và non block I/O bên phải

Block I/o bên trái và non block I/O bên phải

 

Blocking I/O: Trong quá trình truy xuất dữ liêu như biểu đồ trên, các tác vụ phải được chạy một cách tuần tự, chờ đợi thông tin user 1, in thông tin đó ra, chờ đợi tiếp thông tin của user 2. Yêu cầu thực thi một IO operation, sau khi hoàn thành thì trả kết quả lại. Pocess/Theard gọi bị block cho đến khi có kết quả trả về hoặc xảy ra ngoại lệ.

Mô hình Blocking trong Java

Non-Blocking I/O: tác vụ  truy xuất dữ liệu của người dùng 2 được bắt đầu mà không cần sự hồi đáp kết thúc của tác vụ truy cập thông tin người dùng 1, mọi tác vụ gần như được khởi tạo và chạy song song nhau. Yêu cầu thực thi IO operation và trả về ngay lập tức (timeout = 0). Nếu operation chưa sẵn sàng để thực hiện thì thử lại sau. Tương đương với kiểm tra IO operatio có sẵn sàng ngay hay không, nếu có thì thực hiện và trả về, nếu không thì thông báo thử lại sau.

Mô hình non-blocking I/O javascript

Mô hình non-blocking I/O javascript

JavaScript event loop

Bạn nên xem qua video trình bày mô hình vòng lặp sự kiện javascript sau:

Mình tóm tắt bài diễn thuyết trên bằng mô hình sau đây:

Mô hình javascript event loop

Mô hình javascript event loop

  1. Đẩy main()lên ngăn xếp cuộc gọi (call stack).
  2. Đẩy console.log()lên ngăn xếp cuộc gọi. Sau quá trình này, hàm này sẽ được chạy ngay lập tức.
  3. Đẩy setTimeout(2000)lên ngăn xếp. setTimeout(2000)là một API nút. Khi chúng tôi gọi nó, chúng tôi đăng ký cặp gọi lại sự kiện. Sự kiện sẽ đợi 2000 mili giây, sau đó gọi lại là hàm.
  4. Sau khi đăng ký nó trong các API, setTimeout(2000)được bật lên từ ngăn xếp cuộc gọi.
  5. Bây giờ thứ hai setTimeout(0)được đăng ký theo cùng một cách. Bây giờ chúng ta có hai API Node đang đợi để thực hiện.
  6. Sau khi chờ 0 giây, setTimeout(0)được chuyển đến hàng đợi gọi lại và điều tương tự cũng xảy ra với setTimeout(2000).
  7. Trong hàng đợi gọi lại, các chức năng chờ cho ngăn xếp cuộc gọi trống, bởi vì chỉ một câu lệnh có thể thực hiện một thời gian.Điều này được thực hiện bởi vòng lặp sự kiện.
  8. Lần console.log()chạy cuối cùng , và main()được bật lên từ ngăn xếp cuộc gọi.
  9. Vòng lặp sự kiện thấy rằng ngăn xếp cuộc gọi trống và hàng đợi gọi lại không trống. Vì vậy, nó di chuyển các callbacks (trong một thứ tự đầu tiên trong đầu tiên) để ngăn xếp cuộc gọi để thực hiện.

npm là gì?

About the author

Kevin Dang

Hey there! My name is Kevin Dang, I am website, software, mobile app develop, web admin system. Expert living in Hồ Chí Minh (Việt Nam). I am very interested in digital marketing with: SEO, Facebook, Google Ads ... This blog is where I will share the experiences, techniques and knowledge I have learned.