Menu

Node.js và JavaScript khác nhau thế nào?

JavaScript là ngôn ngữ; Node.js là chương trình chạy ngôn ngữ đó bên ngoài trình duyệt. Cú pháp giống hệt nhau, nhưng các biến toàn cục và API có sẵn xung quanh code của bạn thì khác.

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.

JavaScript là một ngôn ngữ lập trình; Node.js là một runtime, tức một chương trình chạy JavaScript bên ngoài trình duyệt. Cú pháp, kiểu dữ liệu và các object chuẩn (Array, Promise, JSON) đều giống nhau ở cả hai. Thứ thay đổi là môi trường xung quanh code: trình duyệt cho bạn window và document để làm việc với trang web, còn Node.js cho bạn global, process, require và các module như fs để làm việc với tệp, server và hệ điều hành.

Các biến toàn cục của trình duyệt in ra undefined, các biến của Node.js in ra object hoặc function, và dòng cuối in ra true, vì trong Node.js globalThis và global là cùng một object. Dán sáu dòng đầu vào console của trình duyệt thì kết quả đảo ngược.

Khác biệt gói gọn trong một bảng

JavaScript trong trình duyệtJavaScript trong Node.js
Bản chấtNgôn ngữ, được engine của trình duyệt chạyCùng ngôn ngữ đó, được runtime Node.js (V8) chạy
Object toàn cụcwindowglobal
Làm việc vớiTrang web: document, DOM, sự kiệnMáy tính: fs, http, process, os
Module<script type="module">, importrequire (CommonJS) và import (ES module)
PackageĐược đóng gói vào trangCài vào node_modules bằng npm
Đầu vàoCú nhấp chuột, form, sự kiện bàn phímĐối số dòng lệnh, standard input, request HTTP
Array, Promise, JSON, setTimeout, consoleCóCó

Hàng về module là chỗ khiến nhiều người vấp nhất. Node.js hỗ trợ cả hai hệ thống, require và import, còn trình duyệt chỉ hiểu import. Trang CommonJS và ES module giải thích nên chọn cái nào.

Ngôn ngữ thì giống nhau

Một hàm chỉ dùng tính năng của ngôn ngữ sẽ chạy ở bất cứ đâu. Đoạn code này không có gì riêng của Node, và nó sẽ in ra đúng những dòng đó trong trình duyệt:

Chương trình in ra {"best":95,"average":85} và Passed: 2 of 3. Cú pháp spread, reduce, template string và JSON thuộc về ngôn ngữ, được định nghĩa bởi chuẩn ECMAScript, nên runtime nào cũng có.

Những gì chỉ Node.js có

Phần riêng của Node là bộ module có sẵn và biến toàn cục làm việc với hệ điều hành:

Chương trình ghi một tệp, đọc lại, rồi in ra .txt 2 lines, sau đó là một danh sách đối số rỗng. Cả việc truy cập tệp lẫn process.argv đều không có trong trình duyệt, nơi một trang web không thể chạm vào ổ đĩa của bạn.

Bạn dùng được những tính năng nào của ngôn ngữ

Ngôn ngữ có các phiên bản (ES2015, ES2020, ES2024 và tiếp nữa), và mỗi engine bổ sung tính năng mới theo tốc độ riêng. Mỗi bản phát hành Node.js đi kèm một engine V8 cụ thể, nên phiên bản Node.js của bạn quyết định tính năng nào dùng được: ví dụ Object.groupBy và Array.prototype.findLast cần một phiên bản mới. Vì vậy bảng tính năng của trình duyệt liệt kê Node.js như thêm một cột bên cạnh Chrome, Firefox và Safari. Hãy chạy node --version khi một cú pháp mới báo SyntaxError hoặc một phương thức là undefined, và nâng cấp trước khi tính đến polyfill.

Viết code chạy được ở cả hai nơi

Tác giả thư viện đôi khi kiểm tra code đang chạy ở đâu trước khi dùng một API riêng của môi trường:

const isNode = typeof process !== 'undefined' && process.versions?.node != null;
const isBrowser = typeof window !== 'undefined';

Khi có thể, hãy kiểm tra tính năng bạn cần chứ không phải tên môi trường: typeof fetch === 'function' cho biết nhiều hơn câu hỏi "đây có phải Node không". Ngày nay cả hai đều có fetch, URL, TextEncoder, setTimeout và structuredClone, nên số code cần kiểm tra ít hơn vài năm trước.

Lỗi thường gặp

Dùng document hoặc window trong script Node.js. Bạn sẽ gặp ReferenceError: document is not defined. Đoạn code đó thuộc về trình duyệt.

Dùng require trong trình duyệt. Trình duyệt không có nó. Hãy dùng import, hoặc một bundler gộp các lệnh gọi require thành một tệp.

Nghĩ rằng Node.js là một ngôn ngữ khác. Không phải vậy. Nếu một hướng dẫn JavaScript dạy điều gì, điều đó chạy được trong Node.js, trừ khi nó dùng DOM.

Câu hỏi thường gặp

Có thể học Node.js mà không học JavaScript không?

Không hẳn. Mọi dòng bạn viết trong Node.js đều là JavaScript, nên cần học ngôn ngữ trước. Khi đã biết hàm, object và promise, Node.js chỉ là một bộ API bổ sung để học thêm.

Vì sao gặp lỗi "document is not defined" trong Node.js?

document là DOM của trình duyệt, và Node.js không có trang web nào để cung cấp nó cho bạn. Code dùng document hoặc window phải chạy trong trình duyệt, hoặc trong môi trường test giả lập DOM, như jsdom.

TypeScript có giống Node.js không?

Không. TypeScript là phiên bản có kiểu của JavaScript và được biên dịch ra JavaScript. Bạn có thể chạy kết quả trong Node.js hoặc trình duyệt, và các phiên bản Node.js gần đây cũng chạy trực tiếp được nhiều tệp .ts bằng cách bỏ phần kiểu đi.

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