Bài 1 · Cơ bản · 16 phút· Cập nhật 11/06/2026
JS chạy ở đâu & cài đặt
Biên soạn bởi Nguyễn Anh Tuấn
Học JavaScript từ đầu: JS chạy trong trình duyệt và Node.js (runtime), thử ngay với Console & REPL, viết chương trình đầu tiên; engine V8 và JIT là gì.
JavaScript ra đời năm 1995 với một nhiệm vụ duy nhất: làm cho trang web sống động (bấm nút, hiện/ẩn, kiểm tra biểu mẫu…). Suốt nhiều năm nó chỉ chạy bên trong trình duyệt. Đến năm 2009, Node.js mang JavaScript ra ngoài - chạy thẳng trên máy tính và máy chủ.
Ai tạo ra JavaScript?
Khi học, bạn sẽ gặp hai môi trường chạy (runtime) chính:
| Môi trường | Chạy ở | “Đồ nghề” riêng |
|---|---|---|
| Trình duyệt | Chrome, Firefox, Safari… | DOM (sửa trang web), sự kiện chuột/bàn phím |
| Node.js | Máy tính / máy chủ | Đọc-ghi tệp, mở server, gọi mạng |
- ▸JS sinh ra cho trình duyệt; từ 2009 chạy được cả ngoài trình duyệt nhờ Node.js.
- ▸Cùng một ngôn ngữ JavaScript, nhưng mỗi môi trường cho “đồ nghề” khác nhau.
- ▸Trình duyệt mạnh về DOM & sự kiện; Node mạnh về tệp, mạng, server.
Runtime (môi trường chạy) là gì?
Cách nhanh nhất để thử JavaScript là không cài gì cả. Mở DevTools (nhấn F12, hoặc chuột phải → “Inspect”), chọn tab Console rồi gõ:
gõ thẳng vào Console của trình duyệt
console.log("Xin chao, JavaScript!"); Kết quả khi chạy
Xin chao, JavaScript!
console.log(...) in một dòng ra Console. Để JavaScript chạy cùng một trang web, ta nhúng nó bằng thẻ <script>:
index.html - JS nhúng trong trang
<!doctype html>
<html>
<body>
<h1>Trang cua toi</h1>
<script>
console.log("JS dang chay trong trang nay!");
// ngay ca sua noi dung trang - se hoc ky o bai DOM
document.querySelector("h1").textContent = "Da doi boi JavaScript";
</script>
</body>
</html> - ▸Console trong DevTools = phòng thí nghiệm: gõ một dòng, thấy kết quả ngay.
- ▸console.log(...) in ra Console; chuỗi đặt trong nháy "..." hoặc '...'.
- ▸Thẻ <script> nhúng JavaScript vào một trang HTML.
console.log hay alert?
Muốn chạy JavaScript như một chương trình thật trên máy (đọc tệp, dựng server…), bạn cần Node.js. Cài bản LTS (ổn định) theo hệ điều hành:
cài Node.js theo hệ điều hành
# Windows: tai bo cai LTS o nodejs.org (.msi),
# hoac: winget install OpenJS.NodeJS.LTS
# macOS:
brew install node # hoac tai .pkg o nodejs.org
# Linux: khuyen dung nvm (quan nhieu phien ban) - xem callout ben duoi
# ban apt co san nhung thuong cu hon
# Kiem tra (ca hai deu di kem Node):
node --version
npm --version Tạo một tệp hello.js rồi chạy bằng lệnh node hello.js:
hello.js
// hello.js - chay bang: node hello.js
console.log("Xin chao tu Node.js!"); Kết quả khi chạy
Xin chao tu Node.js!
Giống trình duyệt có Console, Node có REPL - môi trường tương tác để thử nhanh. Gõ node (không kèm tên tệp) là vào:
REPL của Node - thử nhanh không cần tạo tệp
$ node
Welcome to Node.js.
> 2 + 3
5
> "JavaScript".length
10
> .exit // hoac Ctrl-D de thoat - ▸Node.js = engine V8 + thư viện để chạy JS ngoài trình duyệt.
- ▸Cài kèm npm - trình quản lý gói (học kỹ ở bài “Module (ESM) & npm”).
- ▸node hello.js chạy cả một tệp; gõ node để vào REPL thử nhanh, .exit để thoát.
LTS, nvm, và các runtime khác
Ta hay nói “JavaScript”, nhưng tên chuẩn của ngôn ngữ là ECMAScript - luật do uỷ ban TC39 (thuộc Ecma International) soạn, mỗi năm ra một bản (ES2015/ES6, ES2016, …). Mỗi engine là một implementation - một chương trình hiện thực đúng luật đó:
| Engine | Của | Dùng trong |
|---|---|---|
| V8 | Chrome, Edge, Node.js, Deno | |
| SpiderMonkey | Mozilla | Firefox |
| JavaScriptCore | Apple | Safari, Bun |
Bên trong, engine không đọc thẳng từng dòng chữ. Nó đi qua vài chặng:
đường đi của một đoạn JS bên trong engine
ma nguon (.js)
-> phan tich (parse) -> cay cu phap (AST)
-> bytecode -> thong dich nhanh, chay duoc ngay
-> JIT compile -> nhung doan "nong" thanh MA MAY (rat nhanh) - ▸“JavaScript” ≈ ECMAScript (chuẩn do TC39 soạn); engine là bản cài chạy chuẩn đó.
- ▸Một ngôn ngữ, nhiều engine: V8, SpiderMonkey, JavaScriptCore - code JS chạy được trên cả ba.
- ▸Engine biên dịch sang bytecode rồi JIT những phần “nóng” sang mã máy - không phải thông dịch thuần.
Trung thực
Chọn môi trường theo việc bạn muốn làm, không phải theo “cái nào xịn hơn” - cả hai chạy cùng ngôn ngữ:
- ▸Làm trang web tương tác (sửa giao diện, bắt sự kiện) → chạy trong TRÌNH DUYỆT.
- ▸Làm công cụ dòng lệnh, server, xử lý tệp → chạy bằng NODE.JS.
- ▸Học cú pháp thuần (biến, hàm, mảng…) → đâu cũng được; Console hoặc node REPL đều tiện.
Vài lỗi người mới hay vấp ngay từ bài đầu:
HOA/thường rất quan trọng
console.log("ok"); // dung -> in ra: ok
Console.log("loi"); // ReferenceError: Console is not defined (C hoa la sai) - ▸JavaScript ≠ Java - hai ngôn ngữ khác hẳn nhau (chỉ trùng tên).
- ▸Phân biệt HOA/thường: console khác Console; true khác True.
- ▸Chuỗi phải mở/đóng cùng loại nháy: "..." hoặc '...'.
- ▸Khi sai, đọc thông báo lỗi: nó ghi rõ loại lỗi và dòng - sửa rồi chạy lại.
Tiếp theo
Câu hỏi thường gặp
Gần như không. Năm 1995 ngôn ngữ này tên là LiveScript, rồi đổi thành “JavaScript” vì Java đang rất nổi - thuần tuý là chiêu marketing. Java và JavaScript là hai ngôn ngữ khác hẳn nhau về cú pháp lẫn cách chạy. Có câu nói vui: “Java is to JavaScript as ham is to hamster” (giăm bông với chuột hamster).
ECMAScript (viết tắt ES) là CHUẨN của ngôn ngữ - bộ quy tắc do tổ chức Ecma International và uỷ ban TC39 soạn ra. “JavaScript” là tên thông dụng của ngôn ngữ tuân theo chuẩn đó. Mỗi năm có một bản chuẩn mới bổ sung tính năng (ES2015 còn gọi ES6, rồi ES2016, ES2017… cứ thế mỗi năm). Nói “JavaScript” hay “ECMAScript” thường là nói cùng một thứ.
V8 (của Google, dùng trong Chrome và Node.js), SpiderMonkey (Firefox), JavaScriptCore (Safari) là các ENGINE - chương trình thực sự chạy code JS của bạn. Cùng một ngôn ngữ JavaScript nhưng có nhiều engine - nhiều implementation của cùng một chuẩn, giống Python có CPython, PyPy. Vì cùng theo chuẩn ECMAScript nên một đoạn JS chạy được trên nhiều engine.
Không. Node.js KHÔNG phải ngôn ngữ - nó là một runtime (môi trường chạy): lấy engine V8 và bọc thêm thư viện để JavaScript chạy được NGOÀI trình duyệt (đọc/ghi tệp, mở server, gọi mạng…). Bạn vẫn viết đúng ngôn ngữ JavaScript, chỉ là chạy ở một nơi khác.
Bản chất: event loop & libuv - khoá JS nâng cao →Engine hiện đại làm cả hai. Nó KHÔNG đọc thẳng từng dòng chữ: trước hết phân tích (parse) mã nguồn, dịch sang bytecode rồi thông dịch bytecode đó; phần code chạy nhiều lần (“nóng”) còn được JIT biên dịch sang mã máy lúc chạy để nhanh hơn. Nên gọi chính xác là “biên dịch sang bytecode + JIT”, không phải thông dịch thuần.
Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.
Trả lời vài câu để chắc rằng em đã nắm bài.
Theo bài, Node.js là gì?
- 1
Hello trong Console
Mở DevTools của trình duyệt (phím F12) → tab Console, gõ:
console.log("Xin chao, <tên mèo con>!").Hoàn thành khi: Console in ra đúng câu chào với tên mèo con - không cần cài gì.
- 2
Hello bằng Node
Cài Node.js, tạo tệp
hello.jschứa một dòngconsole.log(...), rồi chạy:node hello.js.Hoàn thành khi: Terminal in ra đúng câu trong
console.log- JS đã chạy ngoài trình duyệt. - 3
Thử trong REPL
Gõ
nodeđể vào REPL, tính12 * 12và đo độ dài chuỗi"JavaScript".length. Kết quả?Hoàn thành khi: 144 và 10. REPL in kết quả ngay, không cần
console.log. - 4
Ngôn ngữ vs engine
Bằng lời: “JavaScript” và “V8” khác nhau ra sao?
Hoàn thành khi: JavaScript = ngôn ngữ (theo chuẩn ECMAScript); V8 = engine, chương trình chạy ngôn ngữ đó.
- 5
Trình duyệt vs Node
Nêu một việc chỉ làm được trong trình duyệt, và một việc Node làm tiện hơn.
Hoàn thành khi: Vd: đổi nội dung trang web (DOM) chỉ có ở trình duyệt; đọc/ghi tệp trên máy thì Node làm được.
- 6
Phiên bản & LTS
Chạy
node --version, ghi lại số phiên bản. LTS nghĩa là gì?Hoàn thành khi: In ra
vXX.Y.Z; LTS = Long-Term Support - bản ổn định, được hỗ trợ lâu, nên dùng để học.