Menu

Node.js là gì? Runtime JavaScript cho người mới

Node.js là một runtime chạy JavaScript bên ngoài trình duyệt, trên máy chủ và trong terminal. Node.js không phải ngôn ngữ, cũng không phải framework: nó gồm V8, một event loop và các API cho tệp, mạng và tiến trình.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

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: fs cho tệp, http cho máy chủ, path, process, crypto, events và nhiều module khác, dùng được qua require hoặc import mà 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ệtNode.js
ChạyTrong một trang webTrong terminal hoặc trên máy chủ
Cówindow, document, DOM, localStoragefs, process, http, Buffer, require
Đối tượng toàn cụcwindow (và globalThis)global (và globalThis)
Tệp trên ổ đĩaKhông truy cập đượcTruy cập đầy đủ, theo quyền của người dùng
setTimeout, console, fetch, URLCó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ờ.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu