Node.js là runtime cho phép chạy JavaScript ngoài trình duyệt, ở phía server hoặc công cụ dòng lệnh, được xây dựng trên V8 engine của Chrome và thư viện libuv để xử lý I/O bất đồng bộ. Khác với JavaScript trên trình duyệt vốn bị giới hạn trong sandbox và gắn với Web APIs, Node.js cho phép code truy cập trực tiếp tài nguyên hệ thống.
Node.js không tự thực thi JavaScript một mình. V8 biên dịch và chạy code JS trên một thread chính duy nhất, còn libuv đảm nhận phần I/O nặng. Khi bạn gọi fs.readFile hay http.request, libuv đẩy thao tác xuống hệ điều hành hoặc thread pool ở nền, rồi đưa callback vào event loop khi xong. Nhờ mô hình non-blocking này, một process Node.js duy trì hàng nghìn kết nối đồng thời mà không tạo thread mới cho mỗi request, phù hợp với workload I/O-heavy. Ngược lại, trình duyệt cung cấp window, document, DOM, localStorage, fetch để tương tác với trang web, nhưng không có fs, http server, path, os, crypto ở mức hệ thống hay quyền truy cập file tuỳ ý vì lý do bảo mật.
- Trình duyệt: có DOM/CSSOM, Web APIs, sandbox, không truy cập file hệ thống.
- Node.js: không có DOM/window, thay vào đó có module hệ thống (
fs,http,path,os), quản lý package qua npm, chạy như process hệ điều hành.
Lỗi thường gặp là dùng API đồng bộ như fs.readFileSync trong request handler hoặc chạy tác vụ nặng CPU như mã hoá, nén ảnh ngay trên event loop, khiến toàn bộ server bị khựng. Nhiều bạn cũng nhầm single-threaded nghĩa là Node.js không tận dụng được đa nhân — thực tế libuv và cluster/worker_threads vẫn dùng thread/process phụ cho I/O và CPU.
Lưu ý: Chọn Node.js cho API server, realtime, tooling nơi I/O chiếm phần lớn thời gian chờ; cân nhắc tách worker riêng hoặc dùng ngôn ngữ khác cho tác vụ CPU-intensive để tránh block event loop.