Node.js là một runtime chạy JavaScript bên ngoài trình duyệt: trên máy chủ, trong terminal hoặc dưới dạng công cụ dòng lệnh. Nó không phải ngôn ngữ lập trình (ngôn ngữ ở đây là JavaScript) và cũng không phải framework (Express mới là framework chạy trên Node.js). Node.js kết hợp engine V8 của Google, phần thực thi JavaScript, với một event loop và các API có sẵn cho tệp, mạng và tiến trình mà trình duyệt không có.
Chương trình in ra nội dung tệp, phiên bản chính (v24) và undefined cho window, vì Node.js không có trang web nào để cung cấp đối tượng đó. fs và process chỉ có trong Node.js; chạy cùng những dòng này trong một tab trình duyệt thì dòng đầu tiên sẽ ném lỗi ngay.
Node.js là framework hay ngôn ngữ?
Không phải cả hai. JavaScript là ngôn ngữ. Node.js là chương trình chạy ngôn ngữ đó, giống như JVM chạy Java hay CPython chạy Python. Framework nằm ở tầng trên: Express, Fastify và NestJS là các thư viện bạn cài vào một dự án Node.js. Trang Node.js vs JavaScript so sánh chi tiết hai thứ này.
Bên trong, Node.js gồm bốn phần:
- V8, engine JavaScript của Chrome. V8 biến code của bạn thành mã máy rồi chạy nó.
- libuv, một thư viện C cung cấp event loop và làm các việc chậm (ổ đĩa, mạng, bộ hẹn giờ) ở chế độ nền, rồi trả kết quả về cho các callback của bạn.
- Các API riêng của Node:
fscho tệp,httpcho máy chủ,path,process,crypto,eventsvà nhiều module khác, dùng được quarequirehoặcimportmà không cần cài thêm. - npm, trình quản lý package đi kèm Node.js, cho bạn truy cập kho package lớn nhất trong mọi ngôn ngữ.
Cách chạy một tệp Node.js
Cài Node.js từ trang web chính thức (chọn bản LTS), rồi kiểm tra trong terminal và chạy một tệp:
node --version # prints v24.x.x or similar
node app.js # runs app.js and exits when it has nothing left to do
node # with no file: an interactive prompt (the REPL)
Một chương trình tự kết thúc khi không còn gì phải chờ: không còn bộ hẹn giờ, không còn máy chủ đang mở, không còn lượt đọc tệp nào đang dang dở. Đó là lý do một script chạy xong thì thoát, còn web server thì chạy mãi.
Non-blocking I/O, ý tưởng cốt lõi
Node.js không chờ những việc chậm. Nó bắt đầu đọc tệp hoặc gửi một request mạng, tiếp tục chạy các dòng tiếp theo, rồi gọi hàm của bạn khi kết quả sẵn sàng.
Hai dòng console.log sau readFile chạy trước, còn nội dung tệp đến sau cùng. Đây là cách một tiến trình Node.js phục vụ hàng nghìn kết nối: trong khi một request chờ cơ sở dữ liệu, event loop vẫn giữ cho các request khác tiếp tục chạy.
Node.js và trình duyệt
| Trình duyệt | Node.js | |
|---|---|---|
| Chạy | Trong một trang web | Trong terminal hoặc trên máy chủ |
| Có | window, document, DOM, localStorage | fs, process, http, Buffer, require |
| Đối tượng toàn cục | window (và globalThis) | global (và globalThis) |
| Tệp trên ổ đĩa | Không truy cập được | Truy cập đầy đủ, theo quyền của người dùng |
setTimeout, console, fetch, URL | Có | Có |
Node.js dùng để làm gì
- Web server và API: backend REST và GraphQL, thường dùng kèm Express.
- Ứng dụng thời gian thực: chat, dashboard trực tiếp và game nhiều người chơi qua WebSocket, khi nhiều kết nối cùng mở một lúc.
- Công cụ dòng lệnh: chính npm, Vite, ESLint, Prettier và trình biên dịch TypeScript đều chạy trên Node.js.
- Script và tự động hóa: đổi tên tệp, gọi API, chuyển dữ liệu.
Cách dùng phổ biến nhất là một HTTP server, và module http có sẵn là đủ cho server đầu tiên:
Server trả lời GET /hello bằng chính đường dẫn nó nhận được. Đổi đường dẫn trên thanh request thành /anything rồi gửi: câu trả lời đổi theo, vì server này xử lý mọi URL bằng một hàm duy nhất.
Khi nào nên chọn Node.js
Hãy chọn Node.js khi phần lớn công việc là chờ I/O (request, cơ sở dữ liệu, tệp) và bạn muốn dùng một ngôn ngữ cho cả frontend lẫn backend. Node.js kém phù hợp hơn với các phép tính dài, nặng về CPU như mã hóa video hay xử lý số liệu lớn, vì một phép tính dài sẽ chặn luồng JavaScript duy nhất và mọi request khác phải chờ nó.
Câu hỏi thường gặp
Node.js là frontend hay backend?
Chủ yếu là backend. Node.js chạy trên máy chủ hoặc trên máy của bạn, không chạy trong trình duyệt của người truy cập. Lập trình viên frontend vẫn dùng nó hằng ngày, vì các công cụ như npm, Vite và ESLint đều là chương trình Node.js.
Ai tạo ra Node.js và vào năm nào?
Ryan Dahl phát hành Node.js vào năm 2009. Hiện nay Node.js do OpenJS Foundation duy trì, cứ sáu tháng có một phiên bản chính mới, và các phiên bản số chẵn được hỗ trợ dài hạn (LTS).
Có cần biết JavaScript trước khi học Node.js không?
Có, ít nhất là phần cơ bản: biến, hàm, đối tượng, mảng, và callback hoặc promise. Node.js bổ sung API chứ không thêm cú pháp mới, nên mọi thứ bạn học về ngôn ngữ đều áp dụng được ngay.
Node.js có phải đơn luồng (single-threaded) không?
Code JavaScript của bạn chạy trên một luồng. Phía sau, Node.js dùng một thread pool nhỏ cho công việc với hệ thống tệp, DNS và một phần crypto, nên I/O chậm không chặn code của bạn trong lúc chờ.