
Chào các Gen Z năng động của Creyt! Hôm nay, chúng ta sẽ cùng nhau "bóc tem" một chủ đề mà nghe thì có vẻ hơi "học thuật" nhưng lại cực kỳ "real" và "chất chơi" trong thế giới Node.js: Core Modules.
Core Modules là gì mà Dev Pro nào cũng phải biết?
Nếu ví Node.js như một siêu anh hùng, thì các Core Modules chính là những siêu năng lực bẩm sinh của anh ta, được trang bị sẵn từ lúc "sinh ra và lớn lên". Khác với những "siêu năng lực" phải đi "tầm sư học đạo" (tức là cài đặt từ npm), Core Modules không cần bạn phải npm install gì sất. Chúng là những thư viện được biên dịch sẵn vào lõi của Node.js, cung cấp các chức năng cơ bản, thiết yếu nhất để bạn có thể xây dựng bất kỳ ứng dụng backend nào.
Tưởng tượng thế này: Node.js là một chiếc smartphone "full option". Core Modules chính là Camera, Gọi điện, Tin nhắn, Lịch... những app "mặc định" mà bạn không thể gỡ bỏ và luôn cần dùng tới. Chúng là nền tảng để bạn phát triển những tính năng phức tạp hơn sau này.
Để làm gì ư? Đơn giản là để Node.js có thể "chạm" được vào thế giới bên ngoài và bên trong máy tính của bạn: từ việc đọc/ghi file, tạo server web, cho đến tương tác với hệ điều hành. Nói cách khác, chúng là cầu nối giúp ứng dụng Node.js của bạn có thể "sống" và "làm việc" một cách hiệu quả.
Những "siêu năng lực" Core Modules tiêu biểu và ví dụ code
Creyt sẽ giới thiệu vài "siêu năng lực" mà bạn sẽ gặp như cơm bữa khi code Node.js:
1. fs (File System): Người giữ cửa kho dữ liệu
- Là gì: Module
fsgiúp Node.js tương tác với hệ thống file trên máy tính của bạn. Đọc file, ghi file, xóa file, tạo thư mục... tất tần tật các thao tác liên quan đến file đều qua tay anh bạn này. - Ví von: Anh chàng
fsnày giống như một thủ thư mẫn cán, biết rõ mọi cuốn sách (file) nằm ở đâu, muốn đọc hay ghi gì cứ bảo anh ấy. - Khi nào dùng: Xử lý dữ liệu từ file cấu hình, lưu trữ log, đọc template HTML, xử lý upload ảnh...
Code Ví Dụ: Đọc một file văn bản
Giả sử bạn có một file hello.txt với nội dung "Hello Gen Z from Creyt!".
const fs = require('fs'); // Gọi 'thủ thư' fs
fs.readFile('hello.txt', 'utf8', (err, data) => {
if (err) {
console.error('Lỗi rồi bạn ơi:', err);
return;
}
console.log('Nội dung file:', data);
});
console.log('Đang đọc file đây, chờ xíu nha...'); // Điều này sẽ in ra trước vì readFile là bất đồng bộ!
Giải thích code:
fs.readFile là một hàm bất đồng bộ (async). Nó sẽ đọc file và khi hoàn tất (hoặc gặp lỗi), nó sẽ gọi hàm callback mà bạn truyền vào. Tham số utf8 là để đảm bảo đọc đúng tiếng Việt có dấu nhé!
2. http (HTTP): Ông chủ nhà hàng online
- Là gì: Module
httplà trái tim của mọi ứng dụng web chạy trên Node.js. Nó cho phép bạn tạo ra các server HTTP để lắng nghe request từ trình duyệt hoặc các ứng dụng khác, và gửi lại response. - Ví von:
httpchính là ông chủ nhà hàng online. Khách hàng (trình duyệt) đặt món (request), ông chủ nhận order, chế biến (xử lý logic) và trả lại món ăn (response). - Khi nào dùng: Xây dựng API backend, website, microservices.
Code Ví Dụ: Tạo một server HTTP đơn giản
const http = require('http'); // Gọi 'ông chủ nhà hàng' http
const hostname = '127.0.0.1'; // Địa chỉ IP cục bộ
const port = 3000; // Cổng mà server sẽ lắng nghe
const server = http.createServer((req, res) => {
res.statusCode = 200; // Mã trạng thái HTTP OK
res.setHeader('Content-Type', 'text/plain; charset=utf-8'); // Thiết lập kiểu nội dung
res.end('Chào Gen Z! Đây là server Node.js của Creyt nè!\n'); // Gửi phản hồi
});
server.listen(port, hostname, () => {
console.log(`Server đang chạy ở http://${hostname}:${port}/`);
});
Giải thích code:
http.createServer tạo ra một server. Hàm callback bên trong nhận hai tham số req (request - yêu cầu từ client) và res (response - phản hồi về client). res.end() kết thúc quá trình phản hồi và gửi dữ liệu đi.
3. path (Path): Cảnh sát giao thông đường file
- Là gì: Module
pathcung cấp các tiện ích để làm việc với đường dẫn file và thư mục. Nó giúp bạn xử lý các đường dẫn một cách độc lập với hệ điều hành (Windows dùng\còn Linux/macOS dùng/). - Ví von:
pathgiống như một cảnh sát giao thông chuyên nghiệp, đảm bảo các "phương tiện" (file, thư mục) đi đúng làn, đúng hướng, không bị lạc đường dù ở Windows hay macOS. - Khi nào dùng: Xây dựng đường dẫn tuyệt đối, nối các phần của đường dẫn, lấy tên file từ đường dẫn, v.v.
Code Ví Dụ: Nối các phần của đường dẫn
const path = require('path'); // Gọi 'cảnh sát giao thông' path
const dirName = 'uploads';
const fileName = 'avatar.jpg';
// Nối các phần đường dẫn một cách an toàn
const fullPath = path.join(__dirname, dirName, fileName);
console.log('Đường dẫn đầy đủ:', fullPath);
// Lấy tên file từ đường dẫn
const baseName = path.basename(fullPath);
console.log('Tên file:', baseName);
// Lấy phần mở rộng của file
const extName = path.extname(fileName);
console.log('Phần mở rộng:', extName);
Giải thích code:
path.join() là hàm "must-use" khi bạn cần nối các phần đường dẫn. Nó tự động xử lý dấu / hoặc \ tùy theo hệ điều hành, tránh lỗi vặt. __dirname là một biến toàn cục trong Node.js, chứa đường dẫn tuyệt đối đến thư mục chứa file script hiện tại.
4. os (Operating System): Thám tử hệ điều hành
- Là gì: Module
oscung cấp các phương thức để tương tác và lấy thông tin về hệ điều hành mà Node.js đang chạy. - Ví von: Anh chàng
osnày như một thám tử tài ba, chỉ cần hỏi là biết tuốt từ tên hệ điều hành, kiến trúc CPU, bộ nhớ trống, cho đến thư mục home của người dùng. - Khi nào dùng: Lấy thông tin hệ thống để cấu hình ứng dụng, debug, hoặc hiển thị thông tin cho người dùng.
Code Ví Dụ: Lấy thông tin hệ điều hành
const os = require('os'); // Gọi 'thám tử' os
console.log('Hệ điều hành:', os.platform());
console.log('Kiến trúc CPU:', os.arch());
console.log('Tổng bộ nhớ (bytes):', os.totalmem());
console.log('Bộ nhớ trống (bytes):', os.freemem());
console.log('Thư mục home của người dùng:', os.homedir());
Giải thích code:
Các hàm của os thường trả về các thông tin cơ bản về hệ điều hành. Rất hữu ích khi bạn cần tùy chỉnh hành vi của ứng dụng dựa trên môi trường mà nó đang chạy.

Mẹo và Best Practices từ Giảng viên Creyt
- "Đừng cố tái tạo bánh xe": Trước khi tìm kiếm một thư viện bên ngoài (npm package) cho một tác vụ cơ bản, hãy luôn kiểm tra xem Node.js Core Modules có cung cấp chức năng đó không. Core Modules thường hiệu quả, ổn định và không thêm dependency không cần thiết.
- Xử lý lỗi là "chân ái": Đặc biệt với các thao tác I/O (input/output) như đọc/ghi file (
fs), luôn luôn phải xử lý lỗi. Mạng có thể đứt, file có thể không tồn tại, ổ đĩa có thể đầy. Hãy chuẩn bị cho mọi kịch bản xấu nhất. - Embrace Asynchronous: Hầu hết các Core Modules đều hoạt động bất đồng bộ (async) để không chặn luồng chính của ứng dụng. Hãy quen với việc sử dụng callbacks, Promises (
fs.promiseslà một phiên bản dựa trên Promise củafs), hoặcasync/awaitđể quản lý các tác vụ này. - Đọc tài liệu gốc: Tài liệu chính thức của Node.js (nodejs.org/docs) là nguồn thông tin "chuẩn cơm mẹ nấu" nhất. Đừng ngại đọc chúng để hiểu sâu hơn về từng module và các phương thức của nó.
Ứng dụng thực tế: "Core Modules ở khắp mọi nơi!"
Bạn có biết, mọi website, mọi ứng dụng backend được xây dựng bằng Node.js đều ít nhiều sử dụng các Core Modules?
- Facebook, Netflix, LinkedIn (có sử dụng Node.js ở một số phần): Các server API của họ chắc chắn dùng
httpđể nhận và xử lý hàng tỷ request mỗi ngày. - Các nền tảng lưu trữ đám mây (Google Drive, Dropbox): Khi bạn upload/download file, các dịch vụ backend sẽ sử dụng
fsđể quản lý việc lưu trữ và truy xuất dữ liệu trên máy chủ. - Các công cụ Build/CI/CD (Webpack, Parcel, Jenkins, GitHub Actions): Những công cụ này dùng
fsvàpathrất nhiều để đọc file cấu hình, xử lý tài nguyên, tạo ra các bundle cuối cùng, và quản lý các script tự động. - Discord: Backend của Discord xử lý rất nhiều dữ liệu thời gian thực, và các thao tác file (gửi ảnh, video) cũng sẽ dựa vào
fs.
Thử nghiệm của Creyt và lời khuyên chân thành
Hồi Creyt mới "chập chững" vào nghề, cũng từng có lúc "ngáo ngơ" đi tìm thư viện bên ngoài để đọc file JSON, mà không biết rằng fs.readFile kết hợp với JSON.parse là đủ dùng rồi. Hoặc loay hoay tự viết hàm nối đường dẫn, để rồi gặp lỗi "path not found" vì Windows và Linux dùng dấu phân cách khác nhau. Đến khi phát hiện ra path.join(), Creyt mới thấy mình "gà" đến mức nào!
Lời khuyên của Creyt:
- Dùng khi: Bạn cần các chức năng cơ bản, hiệu suất cao, không muốn thêm dependency bên ngoài, và đặc biệt là khi tương tác trực tiếp với hệ điều hành (file system, network).
- Tránh khi: Bạn cần các tính năng phức tạp hơn mà Core Modules không cung cấp (ví dụ: một ORM cho database, một framework web đầy đủ như Express). Lúc đó, hãy mạnh dạn tìm kiếm các thư viện từ cộng đồng.
Nhớ nhé các Gen Z! Nắm vững Core Modules là bạn đã có trong tay những "siêu năng lực" nền tảng để trở thành một Dev Node.js "thứ thiệt" rồi đấy. Giờ thì, "code on" thôi!
Thuộc Series: Nodejs
Bài giảng này được tự động xuất bản ngẫu nhiên từ thư viện kiến thức. Đừng quên đón xem các Từ khoá Hướng Dẫn tiếp theo nhé!