"Module là nền tảng giúp chia nhỏ chương trình thành nhiều tệp, dễ quản lý, dễ tái sử dụng và dễ bảo trì. Hầu hết mọi ứng dụng Node.js đều được xây dựng từ các module."
Mục tiêu bài học
Sau bài học này, bạn sẽ:
Module là gì?
Module là một file JavaScript chứa:
biến
hằng số
hàm
class
đối tượng
để có thể sử dụng lại ở nhiều nơi.
Ví dụ:
project
│
├── app.js
├── math.js
└── string.js
Thay vì viết toàn bộ chương trình trong một file, chúng ta chia thành nhiều module.
Ưu điểm:
Vì sao cần Module?
Giả sử bạn viết toàn bộ chương trình trong một file:
app.js
Sau vài tháng:
3000 dòng
5000 dòng
10000 dòng
Việc tìm kiếm và sửa lỗi sẽ trở nên rất khó khăn.
Module giúp chia chương trình thành từng phần nhỏ.
Ví dụ:
controllers/
models/
routes/
services/
utils/
Đây cũng là cách tổ chức mà Express và NestJS sử dụng.
CommonJS
Trong nhiều năm, Node.js sử dụng hệ thống module mặc định là:
CommonJS
CommonJS sử dụng:
require()
module.exports
Đây vẫn là hệ thống rất phổ biến và bạn sẽ gặp trong nhiều dự án cũ.
Tạo Module đầu tiên
Tạo file:
math.js
function sum(a, b) {
return a + b;
}
module.exports = sum;
Trong app.js
const sum = require("./math");
console.log(sum(10, 20));
Kết quả:
30
Export nhiều hàm
function sum(a, b) {
return a + b;
}
function sub(a, b) {
return a - b;
}
module.exports = {
sum,
sub
};
Import:
const math = require("./math");
console.log(math.sum(10, 5));
console.log(math.sub(10, 5));
Kết quả:
15
5
Destructuring
Có thể viết ngắn hơn:
const { sum, sub } = require("./math");
console.log(sum(5, 5));
console.log(sub(10, 3));
Export biến
const PI = 3.14;
module.exports = PI;
Import:
const PI = require("./math");
console.log(PI);
Export Object
module.exports = {
name: "Node.js",
version: "2026"
};
Import:
const app = require("./math");
console.log(app.name);
console.log(app.version);
ES Module
JavaScript hiện đại đã có hệ thống module riêng.
Đó là:
ES Module
Sử dụng:
import
export
Đây là chuẩn chính thức của JavaScript và ngày càng được sử dụng rộng rãi trong các dự án mới.
Kích hoạt ES Module
Mở file:
package.json
Thêm:
{
"type": "module"
}
Từ bây giờ Node.js sẽ hiểu rằng project sử dụng ES Module.
Export
Ví dụ:
export function sum(a, b) {
return a + b;
}
Import:
import { sum } from "./math.js";
console.log(sum(20, 30));
Kết quả:
50
Export nhiều hàm
export function sum(a, b) {
return a + b;
}
export function sub(a, b) {
return a - b;
}
Import:
import { sum, sub } from "./math.js";
console.log(sum(10, 2));
console.log(sub(10, 2));
Default Export
export default function hello() {
console.log("Hello Node.js");
}
Import:
import hello from "./hello.js";
hello();
So sánh CommonJS và ES Module
| CommonJS | ES Module |
|---|
| require() | import |
| module.exports | export |
| exports | export |
| Mặc định của Node.js cũ | Chuẩn JavaScript hiện đại |
| Phổ biến ở dự án cũ | Phổ biến ở dự án mới |
package.json là gì?
Mỗi project Node.js đều có:
package.json
Đây là "chứng minh thư" của project.
Nó chứa:
tên project
phiên bản
tác giả
dependencies
scripts
license
type
Ví dụ:
{
"name": "node-basic",
"version": "1.0.0",
"type": "module"
}
Tạo package.json
Chạy:
npm init
Hoặc nhanh hơn:
npm init -y
Node.js sẽ tự sinh:
package.json
Cấu trúc thư mục
Ví dụ:
node-basic
│
├── package.json
├── app.js
├── math.js
├── string.js
└── utils.js
Đây là cách tổ chức cơ bản của hầu hết các dự án Node.js.
Khi nào dùng CommonJS?
Nên dùng khi:
Khi nào dùng ES Module?
Đối với các dự án mới, nên ưu tiên ES Module vì:
là chuẩn chính thức của JavaScript
cú pháp hiện đại
đồng nhất với trình duyệt
được các framework mới như Express 5, Vite và Next.js hỗ trợ tốt
Trong khóa học này, chúng ta sẽ ưu tiên sử dụng ES Module, đồng thời vẫn tìm hiểu CommonJS để có thể đọc và bảo trì các dự án cũ.
Một số lỗi thường gặp
Không thêm "type": "module"
Ví dụ:
import { sum } from "./math.js";
Sẽ báo lỗi nếu project vẫn đang dùng CommonJS.
Quên phần mở rộng .js
Sai:
import { sum } from "./math";
Đúng:
import { sum } from "./math.js";
Sai đường dẫn
import { sum } from "./utils/math.js";
Hãy kiểm tra lại vị trí file và đường dẫn tương đối.
Trộn CommonJS và ES Module
Không nên viết:
const fs = require("fs");
import { sum } from "./math.js";
Hãy thống nhất sử dụng một hệ thống module trong cùng một project.
Tổng kết
Qua bài học này, bạn đã biết:
✅ Module giúp chia chương trình thành nhiều file nhỏ.
✅ Hiểu cách sử dụng require() và module.exports trong CommonJS.
✅ Hiểu cách sử dụng import và export trong ES Module.
✅ Biết vai trò của package.json.
✅ Biết khi nào nên dùng CommonJS và khi nào nên dùng ES Module.
Module là nền tảng quan trọng của Node.js. Từ bài học này trở đi, hầu hết các chương trình trong khóa học sẽ được tổ chức thành nhiều module thay vì chỉ một file duy nhất.
Bài tập thực hành
Bài 1
Tạo file math.js chứa hàm:
export function sum(a, b) {
return a + b;
}
Import vào app.js và hiển thị kết quả của:
sum(10, 20)
//bài giải:
import {sum} from "./math.js";
console.log(sum(10, 20));
Bài 2
Thêm hai hàm:
Import cả ba hàm và tính:
Bài giải:
math.js
export function sum(a, b) {
return a + b;
}
export function sub(a, b) {
return a - b;
}
export function mul(a, b) {
return a * b;
}
app.js
import {sum, sub, mul} from "./math.js";
console.log(sum(20, 5));
console.log(sub(20, 5));
console.log(mul(20, 5));
Bài 3
Tạo hello.js sử dụng Default Export để in:
Hello Node.js!
Sau đó import và gọi hàm trong app.js.
Bài giải:
hello.js
export default function hello() {
console.log("Hello Node.js");
}
app.js
import hello from "./hello.js";
hello();
Bài 4
Khởi tạo một project mới bằng:
npm init -y
Mở package.json và giải thích ý nghĩa của các trường:
name (tên project)
version (phiên bản)
type (kiểu module)
Bài 5 ⭐ Thử thách
Tạo project với cấu trúc:
node-basic
│
├── app.js
├── package.json
└── utils
├── math.js
└── string.js
Trong đó:
math.js chứa các hàm tính toán (sum, sub).
string.js chứa hàm chuyển chuỗi thành chữ in hoa (toUpperCase).
Import các module vào app.js và kiểm tra kết quả.
Bài Giải:
math.js
export function sum(a, b) {
return a + b;
}
export function sub(a, b) {
return a - b;
}
string.js
export function inHoa (s) {
return String(s).toUpperCase();
}
app.js
import {sum, sub} from "./utils/math.js";
import {inHoa} from "./utils/string.js";
console.log(sum(5, 10));
console.log(sub(5, 10));
console.log(inHoa("hello node.js"));
📖 Bài tiếp theo: Bài 05 — npm: package.json, package-lock.json, dependencies, devDependencies và scripts.
x1
quay về MỤC LỤC