- 1 1. Giới thiệu: Quản lý mô-đun trong JavaScript là gì?
- 2 2. require là gì? Các khái niệm cốt lõi và vai trò của nó
- 3 3. Cách sử dụng cơ bản của require (Với Các Ví dụ Mã)
- 4 4. Sự Khác Biệt Giữa require và import: CommonJS so với ES Modules
- 5 5. Cách Sử dụng require trong Môi trường Trình duyệt
- 6 6. Hướng dẫn thực tế về các Bundler mô-đun: Ví dụ cấu hình Webpack & Browserify
- 7 7. Ví Dụ Thực Hành: Xây Dựng Dự Án Sử Dụng require
- 8 8. Câu hỏi Thường gặp (FAQ): Giải quyết các câu hỏi thường gặp về require
- 8.1 1. Tôi có thể sử dụng require trong môi trường ES6 không?
- 8.2 2. Tôi nhận được lỗi “module not found” khi sử dụng require. Tôi nên làm gì?
- 8.3 3. Tôi có thể trộn lẫn require và import trong cùng một dự án không?
- 8.4 4. Tôi có thể sử dụng require một cách động không?
- 8.5 5. require.cache là gì?
- 8.6 6. Làm sao tôi có thể sử dụng require trong môi trường trình duyệt mà không hỗ trợ?
- 8.7 7. Nếu một mô-đun bên ngoài cũ gây lỗi với require thì sao?
- 8.8 8. Tôi có thể tải các tệp JSON bằng require không?
- 8.9 Summary
- 9 9. Tổng kết và các bước tiếp theo
- 10 10. Tóm tắt cuối cùng và tích hợp toàn bộ phần
1. Giới thiệu: Quản lý mô-đun trong JavaScript là gì?
JavaScript được sử dụng rộng rãi như một ngôn ngữ kịch bản đơn giản và linh hoạt. Tuy nhiên, khi các ứng dụng ngày càng lớn lên, việc quản lý mã trở nên ngày càng khó khăn. Đó là lúc “quản lý mô-đun” xuất hiện.
Bằng cách áp dụng quản lý mô-đun, bạn có thể chia mã theo chức năng và làm cho chúng có thể tái sử dụng. Cách tiếp cận này cải thiện khả năng bảo trì và đọc hiểu, đồng thời giúp các nhóm làm việc mượt mà hơn trong môi trường phát triển hợp tác.
Trong phần này, chúng ta sẽ tóm tắt ngắn gọn khái niệm cơ bản của quản lý mô-đun trong JavaScript và giới thiệu một hàm quan trọng: require.
Mô-đun là gì?
Mô-đun đề cập đến một tệp độc lập hoặc một khối mã gói lại một chức năng hoặc dữ liệu cụ thể. Trong JavaScript, việc sử dụng mô-đun mang lại các lợi ích sau.
- Tái sử dụng mã – Bạn không cần phải viết lại cùng một đoạn mã nhiều lần, giúp phát triển hiệu quả hơn.
- Cải thiện khả năng bảo trì – Mã trở nên dễ hiểu hơn, việc sửa lỗi và thêm tính năng trở nên đơn giản hơn.
- Rõ ràng về phụ thuộc – Bạn có thể chỉ định một cách rõ ràng nơi các tính năng hoặc dữ liệu cần thiết đến từ đâu.
Hệ thống mô-đun JavaScript
JavaScript chủ yếu có hai hệ thống mô-đun sau.
- CommonJS
- Chủ yếu được sử dụng trong môi trường Node.js.
- Sử dụng hàm
requiređể nhập mô-đun. - Được áp dụng rộng rãi trong phát triển phía máy chủ.
- ES Modules (ECMAScript Modules)
- Được chuẩn hoá từ ES6.
- Sử dụng câu lệnh
importđể làm việc với mô-đun. - Có sẵn cả trong trình duyệt và trên máy chủ.
Hàm require là gì?
Chúng tôi sẽ giải thích chi tiết sau, nhưng require là một hàm dùng để nhập mô-đun trong hệ thống CommonJS. Nó thường được sử dụng trong môi trường Node.js. Dưới đây là một ví dụ cơ bản.
const fs = require('fs'); // Import the file system module
const data = fs.readFileSync('example.txt', 'utf8');
console.log(data);
Trong đoạn mã này, mô-đun tích hợp sẵn fs được nhập để đọc một tệp.
Tại sao quản lý mô-đun lại quan trọng
Quản lý mô-đun có thể có vẻ không cần thiết cho các dự án nhỏ. Tuy nhiên, khi dự án phát triển, mã trở nên phức tạp hơn và các phụ thuộc tăng lên. Nếu bạn không quản lý chúng một cách thích hợp, các vấn đề sau có thể xảy ra.
- Mã trùng lặp nhiều hơn.
- Thay đổi trở nên khó khăn hơn.
- Hợp tác trong phát triển nhóm trở nên khó khăn.
Để giải quyết những vấn đề này, bạn cần hiểu và sử dụng đúng các cơ chế mô-đun như require và import.
Tóm tắt
Trong phần này, chúng tôi đã giải thích khái niệm cơ bản của quản lý mô-đun trong JavaScript và lý do tại sao nó quan trọng. Chúng tôi cũng đã giới thiệu ngắn gọn sự khác nhau giữa CommonJS và ES Modules, và đề cập đến vai trò của hàm require, sẽ được trình bày chi tiết hơn trong các phần sau.
Trong phần tiếp theo, chúng tôi sẽ giải thích “require là gì?” một cách chi tiết hơn và giới thiệu cách sử dụng nó với mã mẫu.

2. require là gì? Các khái niệm cốt lõi và vai trò của nó
Trong JavaScript, việc quản lý mã trong các mô-đun và gọi các tính năng khi cần thiết là rất quan trọng. Trong phần này, chúng tôi sẽ giải thích chi tiết hàm require trong hệ thống mô-đun CommonJS.
Hàm require là gì?
Hàm require là một cơ chế để nhập mô-đun trong hệ thống mô-đun CommonJS. Nó đặc biệt được sử dụng trong môi trường Node.js, và được thiết kế để giúp bạn làm việc dễ dàng với các thư viện bên ngoài và các mô-đun tự tạo của mình.
Đoạn mã dưới đây cho thấy một ví dụ về việc nhập mô-đun tích hợp sẵn có tên fs.
const fs = require('fs'); // Dynamically import the file system module at runtime
const data = fs.readFileSync('example.txt', 'utf8'); // Read a file synchronously
console.log(data); // Output the loaded contents
Các điểm chính:
- fs : Một mô-đun tích hợp sẵn của Node.js (dành cho các thao tác hệ thống tệp).
- require(‘fs’) : Nhập mô-đun
fs. - readFileSync : Một hàm đọc nội dung tệp một cách đồng bộ.
Trong ví dụ này, require giúp dễ dàng nhập chức năng và sử dụng nó ngay lập tức.
Cú pháp cơ bản của require
const moduleName = require('moduleName');
Tham số:
- moduleName : Tên của module cần nhập. Điều này có thể là một module tích hợp sẵn, một module tùy chỉnh, hoặc một gói npm.
Giá trị trả về:
- Trả về đối tượng hoặc hàm được xuất bởi module.
Ví dụ: Tải một Module cục bộ
const myModule = require('./myModule'); // './' indicates the current directory
console.log(myModule.sayHello());
Hệ thống Module CommonJS
Hàm require dựa trên hệ thống module CommonJS. Hệ thống này chủ yếu được sử dụng trong môi trường phía server và có các đặc điểm sau.
- Tải đồng bộ
- Các module được tải theo thứ tự tại thời điểm chạy.
- Điều này phù hợp ở phía server, nhưng các cách tiếp cận bất đồng bộ thường được ưu tiên ở phía client.
- Xuất và nhập module
- Ở phía module,
module.exportsđược sử dụng để công khai chức năng ra bên ngoài. - Ở phía nhập,
requiređược sử dụng để sử dụng nó.
Ví dụ: Xuất một Module
// myModule.js
module.exports = {
sayHello: () => 'Hello, World!',
};
Module này có thể được sử dụng từ một file khác qua require.
Ưu điểm của require
- Cú pháp đơn giản và dễ hiểu
- Trực quan ngay cả với người mới bắt đầu JavaScript.
- Phù hợp tuyệt vời với Node.js
- Node.js được thiết kế xung quanh CommonJS, vì vậy
requirelà sự kết hợp tự nhiên.
- Dễ dàng truy cập các gói npm
- Bạn có thể dễ dàng nhập các thư viện được cài đặt từ npm (Node Package Manager).
Ví dụ: Nhập framework Express
const express = require('express');
const app = express();
Lưu ý và Hạn chế
- Không thể sử dụng trực tiếp trong trình duyệt
requirelà tính năng cụ thể của Node.js và không được hỗ trợ trong trình duyệt.- Để sử dụng nó trong trình duyệt, bạn cần một bundler như Webpack hoặc Browserify.
- Mối lo ngại về hiệu suất do tải đồng bộ
- Vì các module được tải theo thứ tự tại thời điểm chạy, các ứng dụng lớn có thể gặp thời gian tải chậm hơn.
Tóm tắt
Trong phần này, chúng tôi đã giải thích vai trò cơ bản và cú pháp của hàm require. Chúng tôi cũng đã đề cập đến cách nó liên quan đến hệ thống CommonJS, cùng với ưu điểm và hạn chế của nó.
Trong phần tiếp theo, chúng tôi sẽ giải thích “Cách sử dụng cơ bản của require với các ví dụ mã” và giới thiệu các cách sử dụng thực tế.

3. Cách sử dụng cơ bản của require (Với Các Ví dụ Mã)
Trong phần này, chúng tôi sẽ giải thích chi tiết cách sử dụng cơ bản của hàm require trong JavaScript, cùng với các ví dụ mã thực tế.
Cách Nhập Module
1. Nhập Các Module Tích Hợp Sẵn
Node.js cung cấp nhiều module tích hợp sẵn. Bằng cách sử dụng hàm require, bạn có thể nhập các module này một cách dễ dàng.
Ví dụ: Sử dụng module hệ thống file (fs)
const fs = require('fs'); // Import the fs module
const data = fs.readFileSync('example.txt', 'utf8'); // Read the file synchronously
console.log(data); // Output the result
Trong ví dụ này, module fs được sử dụng để đọc nội dung của một file.
2. Nhập Các Module Cục Bộ
Bạn có thể tạo các module của riêng mình dưới dạng file trong dự án và nhập chúng dễ dàng bằng require.
File module (mathModule.js):
module.exports.add = (a, b) => a + b;
module.exports.subtract = (a, b) => a - b;
File nhập (main.js):
const math = require('./mathModule'); // Import a local module
console.log(math.add(10, 5)); // Output: 15
console.log(math.subtract(10, 5)); // Output: 5
Các điểm chính:
'./'chỉ thư mục hiện tại.- Phần mở rộng file
.jscó thể được bỏ qua.
3. Nhập Các Gói npm
Các thư viện bên ngoài được cài đặt qua npm cũng có thể được nhập bằng require.
Ví dụ: Sử dụng gói axios
- Cài đặt gói
npm install axios
- **Ví dụ mã
const axios = require('axios'); // Import the axios library axios.get('https://api.example.com/data') .then(response => { console.log(response.data); // Display the data }) .catch(error => { console.error(error); // Handle errors });
Điểm chính:
- Các gói được cài đặt qua npm được lưu trữ trong thư mục
node_modules. - Đó là lý do bạn có thể sử dụng nó đơn giản bằng cách viết
require('axios').
Cách Sử Dụng require Động
Hàm require cũng có thể nhập các mô-đun một cách động. Điều này cho phép bạn linh hoạt chuyển đổi các mô-đun dựa trên các điều kiện.
Ví dụ: Nhập động
const moduleName = process.env.USE_MODULE || 'defaultModule';
const myModule = require(`./modules/${moduleName}`);
console.log(myModule.someFunction());
Điểm chính:
- Bạn có thể chuyển đổi các mô-đun qua các biến môi trường, điều này hữu ích cho phát triển và kiểm thử linh hoạt.
- Vì các mô-đun chỉ tải khi cần, nó cũng có thể giúp tối ưu hóa việc sử dụng bộ nhớ.
Các Lỗi Thường Gặp Và Khắc Phục Sự Cố
- Lỗi không tìm thấy mô-đun
Ví dụ lỗi:
Error: Cannot find module './myModule'
Nguyên nhân:
- Đường dẫn tệp không chính xác.
- Mô-đun không tồn tại, hoặc phần mở rộng không thể bị bỏ qua trong một số trường hợp.
Giải pháp:
- Chỉ định đường dẫn tệp và phần mở rộng một cách chính xác.
const myModule = require('./myModule.js'); // Explicitly include the extension
- Một gói bên ngoài chưa được cài đặt
Ví dụ lỗi:
Error: Cannot find module 'axios'
Nguyên nhân:
- Gói npm chưa được cài đặt.
Giải pháp:
npm install axios
Cài đặt lại gói.
- Lỗi phụ thuộc vòng
Ví dụ lỗi:
TypeError: Cannot read property 'someFunction' of undefined
Nguyên nhân:
- Một phụ thuộc vòng đang xảy ra giữa các mô-đun.
Giải pháp:
- Tái tổ chức các phụ thuộc mô-đun để tránh tham chiếu vòng.
Tóm Tắt
Trong phần này, chúng tôi đã giải thích cách sử dụng cơ bản của hàm require, bao gồm cách nhập các mô-đun tích hợp, mô-đun cục bộ và các gói npm với các ví dụ. Chúng tôi cũng đã đề cập đến require động và khắc phục sự cố.
Trong phần tiếp theo, chúng tôi sẽ giải thích chi tiết “Sự khác biệt giữa require và import”, bao gồm đặc điểm của chúng và cách chọn giữa chúng.

4. Sự Khác Biệt Giữa require và import: CommonJS so với ES Modules
Trong JavaScript, có hai hệ thống để làm việc với các mô-đun: CommonJS và ES Modules (ECMAScript Modules). Mỗi hệ thống khác nhau về cách sử dụng và môi trường được hỗ trợ, vì vậy việc chọn đúng cái phù hợp cho dự án của bạn là rất quan trọng. Trong phần này, chúng tôi sẽ giải thích chi tiết sự khác biệt giữa require và import.
Sự Khác Biệt Chính Giữa require và import
| Feature | require | import |
|---|---|---|
| Module system | CommonJS | ES Modules (ECMAScript Modules) |
| Environment | Node.js (server-side) | Browsers and Node.js |
| Load timing | Loaded synchronously at runtime | Loaded ahead of time during static analysis |
| Syntax style | Function call | Syntax-based declaration |
| Module export | module.exports and exports | export and export default |
| Flexibility | Dynamic import is possible | Primarily static import (dynamic import uses a separate syntax) |
Đặc Điểm Và Cách Sử Dụng của require
require được sử dụng trong CommonJS, hệ thống mô-đun tiêu chuẩn trong Node.js.
Ví dụ: require CommonJS
const math = require('./mathModule'); // Import a module
console.log(math.add(2, 3)); // Result: 5
Phía xuất (mathModule.js):
module.exports.add = (a, b) => a + b;
module.exports.subtract = (a, b) => a - b;
Đặc điểm:
- Hỗ trợ nhập động, cho phép chuyển đổi linh hoạt qua các điều kiện.
- Tải tại thời gian chạy, phù hợp với các tình huống cần mô-đun theo yêu cầu.
- Được tối ưu hóa cho môi trường phía máy chủ.
Đặc Điểm Và Cách Sử Dụng của import
Trong ES Modules, bạn sử dụng import để nhập các mô-đun. Cách tiếp cận này được chuẩn hóa trong ECMAScript 2015 (ES6).
Ví dụ: import ES Modules
import { add, subtract } from './mathModule.js'; // Import a module
console.log(add(2, 3)); // Result: 5
Phía xuất (mathModule.js):
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;
Đặc điểm:
- Các module được tải trước dựa trên phân tích tĩnh.
- Vì các module được đánh giá trước khi thực thi, việc tối ưu hóa và phát hiện lỗi dễ dàng hơn.
- Hoạt động trong môi trường phía client (trình duyệt) cũng như vậy.
So sánh require và import với Các Ví dụ Cụ thể
1. Cách các module được tải
require (CommonJS):
const fs = require('fs'); // Dynamically loaded at runtime
import (ES Modules):
import fs from 'fs'; // Loaded statically before execution
2. Import động
require:
if (process.env.ENV === 'development') {
const debug = require('./debugModule');
debug.log('Development mode');
}
import:
if (process.env.ENV === 'development') {
import('./debugModule').then((debug) => {
debug.log('Development mode');
});
}
Điểm chính:
requirelàm cho import động trở nên đơn giản, nhưng vớiimportbạn thường sử dụng import bất đồng bộ dựa trên Promise.
Cách Chọn Dựa trên Trường hợp Sử dụng
- Phát triển phía server (Node.js)
- Khuyến nghị:
require(CommonJS) - Lý do: CommonJS là mặc định trong Node.js, vì vậy nó hoạt động mà không cần cấu hình bổ sung trong nhiều thiết lập.
- Phát triển dựa trên trình duyệt hiện đại
- Khuyến nghị:
import(ES Modules) - Lý do: ES Modules là tiêu chuẩn JavaScript hiện đại và tích hợp tốt với trình duyệt và các framework phía front-end.
- Môi trường lai và các dự án mới
- Khuyến nghị:
import(ES Modules) - Lý do: Việc tuân thủ các thông số kỹ thuật hiện đại giúp đảm bảo khả năng bảo trì lâu dài và tương thích.
Cách Di chuyển từ require sang import
Để di chuyển từ CommonJS sang ES Modules, hãy làm theo các bước sau.
- Thay đổi phần mở rộng tệp thành
.mjs. - Thay thế xuất
module.exportsbằngexport. - Thay thế import
requirebằngimport.
Ví dụ:
// CommonJS
module.exports = { add, subtract };
// ES Modules
export { add, subtract };
Tóm tắt
Trong phần này, chúng tôi đã giải thích sự khác biệt giữa require và import. Bằng cách hiểu đặc điểm của từng hệ thống, môi trường được hỗ trợ và các tình huống sử dụng tốt nhất, bạn có thể quản lý module hiệu quả hơn.
Trong phần tiếp theo, chúng tôi sẽ giải thích “Cách sử dụng require trong môi trường trình duyệt,” bao gồm các công cụ và ví dụ cấu hình.

5. Cách Sử dụng require trong Môi trường Trình duyệt
Hàm require phụ thuộc vào hệ thống module CommonJS của Node.js, vì vậy nó không thể được sử dụng trực tiếp trong môi trường trình duyệt. Điều này là vì trình duyệt không hỗ trợ hệ thống module CommonJS một cách tự nhiên.
Tuy nhiên, trong phát triển ứng dụng web, có nhiều tình huống bạn cần chức năng tương tự như require. Trong phần này, chúng tôi sẽ giải thích các giải pháp để sử dụng require trong trình duyệt.
Tại sao require Không Hoạt động trong Trình duyệt
- CommonJS được thiết kế cho sử dụng phía server
- CommonJS được thiết kế cho Node.js và tải module đồng bộ ở phía server.
- Trình duyệt phụ thuộc nhiều vào xử lý bất đồng bộ
- Trong trình duyệt, việc tải script bất đồng bộ là phổ biến. Vì lý do đó, việc tải module đồng bộ như
requirekhông lý tưởng.
- Sự nổi lên của ES Modules
- JavaScript hiện đại đã chuẩn hóa cú pháp
import, và trình duyệt hiện hỗ trợ nó một cách tự nhiên.
Giải pháp để Sử dụng require trong Trình duyệt
Để đạt được chức năng tương tự như require trong trình duyệt, bạn có thể sử dụng module bundler hoặc transpiler.
1. Sử dụng Browserify
Browserify là một công cụ chuyển đổi mã kiểu CommonJS thành định dạng chạy trong trình duyệt.
Các bước:
- Cài đặt
npm install -g browserify
- Ví dụ thiết lập dự án
index.js (ví dụ):
const math = require('./mathModule');
console.log(math.add(2, 3));
mathModule.js (ví dụ):
module.exports.add = (a, b) => a + b;
module.exports.subtract = (a, b) => a - b;
- Lệnh build
.
browserify index.js -o bundle.js
- Bao gồm script đã bundle trong một tệp HTML
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Browserify Example</title> </head> <body> <script src="bundle.js"></script> </body> </html>
Bây giờ, mã của bạn sử dụng require sẽ chạy trong trình duyệt.
2. Sử dụng Webpack
Webpack là một bundler mô-đun phổ biến và được sử dụng rộng rãi trong các dự án JavaScript hiện đại.
Các bước:
- Cài đặt
npm install webpack webpack-cli --save-dev
- Ví dụ cấu trúc dự án
src/index.js:
const math = require('./mathModule');
console.log(math.add(10, 20));
src/mathModule.js:
module.exports.add = (a, b) => a + b;
- Tạo webpack.config.js:
const path = require('path'); module.exports = { entry: './src/index.js', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist'), }, };
- Lệnh build:
npx webpack
- Bao gồm script đã bundle trong một tệp HTML:
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Webpack Example</title> </head> <body> <script src="./dist/bundle.js"></script> </body> </html>
Sử dụng ES Modules (Đề xuất)
Các trình duyệt hiện đại hỗ trợ ES Modules một cách nguyên bản, giúp việc quản lý mô-đun dễ dàng hơn rất nhiều.
Ví dụ:
import { add } from './mathModule.js';
console.log(add(3, 4));
Thêm type=”module” trong HTML:
<script type="module" src="index.js"></script>
Vì cách tiếp cận này tuân theo các tiêu chuẩn hiện đại, không cần transpiling đặc biệt, và tính tương thích được duy trì lâu dài.
Bạn nên chọn phương pháp nào?
| Method | Key Features | Recommended Scenario |
|---|---|---|
| Browserify | Lets you use Node.js-style code as-is. Best for small projects. | Ideal for older codebases or lightweight single-page apps. |
| Webpack | A powerful tool for modern development environments. Highly flexible. | Ideal for large projects and modern front-end development. |
| ES Modules (native) | No transpiling needed and follows modern standards. Lightweight and simple. | Ideal for small to medium modern apps running in the browser. |
Tóm tắt
Trong phần này, chúng tôi đã giải thích các thách thức và giải pháp cho việc sử dụng require trong môi trường trình duyệt.
- Hiểu tại sao
requirekhông hoạt động trực tiếp trong trình duyệt. - Sử dụng các bundler mô-đun (Browserify, Webpack) để làm cho nó hoạt động.
- Các trình duyệt hiện đại khuyến nghị sử dụng ES Modules.
Trong phần tiếp theo, có tiêu đề “Hướng dẫn thực tế về các Bundler mô-đun,” chúng tôi sẽ giải thích chi tiết hơn các ví dụ cấu hình Webpack và Browserify.

6. Hướng dẫn thực tế về các Bundler mô-đun: Ví dụ cấu hình Webpack & Browserify
Trong phần này, chúng tôi sẽ giải thích các ví dụ cấu hình cho Webpack và Browserify, những công cụ giúp củng cố việc quản lý mô-đun JavaScript. Bằng cách sử dụng các công cụ này, bạn cũng có thể sử dụng require trong môi trường trình duyệt.
1. Hướng dẫn thực tế Webpack
Webpack được sử dụng rộng rãi như một bundler mô-đun. Nó đặc biệt phù hợp cho phát triển front-end hiện đại và có thể chuyển đổi mã sử dụng require và import thành định dạng thân thiện với trình duyệt.
Ví dụ thiết lập Webpack cơ bản
1. Khởi tạo dự án
npm init -y
2. Cài đặt các gói cần thiết
npm install webpack webpack-cli --save-dev
3. Cấu trúc thư mục
/project
├── src/
│ ├── index.js
│ ├── mathModule.js
├── dist/
│ ├── index.html
├── webpack.config.js
├── package.json
4. Mã nguồn ví dụ
src/mathModule.js:
module.exports.add = (a, b) => a + b;
module.exports.subtract = (a, b) => a - b;
src/index.js:
const math = require('./mathModule');
console.log(math.add(2, 3));
5. Tạo tệp cấu hình Webpack
webpack.config.js:
const path = require('path');
module.exports = {
entry: './src/index.js', // Entry point
output: {
filename: 'bundle.js', // Output file name
path: path.resolve(__dirname, 'dist') // Output folder
},
mode: 'development' // Development mode
};
6. Chạy build
npx webpack
Chạy lệnh này sẽ tạo ra dist/bundle.js.
7. Nhúng vào HTML
dist/index.html:
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Webpack Example</title>
</head>
<body>
<script src="bundle.js"></script>
</body>
</html>
Điều này cho phép mã sử dụng require chạy trong trình duyệt.
2. Hướng Dẫn Thực Hành Browserify
Browserify chuyển đổi quản lý mô-đun Node.js sang định dạng có thể chạy trong trình duyệt. Nó phù hợp nhất cho các dự án đơn giản và các ứng dụng nhỏ.
Ví dụ Cài Đặt Cơ Bản cho Browserify
1. Khởi tạo dự án
npm init -y
2. Cài đặt các gói cần thiết
npm install -g browserify
3. Cấu trúc thư mục
/project
├── index.js
├── mathModule.js
├── index.html
4. Mã nguồn ví dụ
mathModule.js:
module.exports.add = (a, b) => a + b;
module.exports.subtract = (a, b) => a - b;
index.js:
const math = require('./mathModule');
console.log(math.add(5, 10));
5. Chạy quá trình build
browserify index.js -o bundle.js
6. Nhúng vào HTML
index.html:
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Browserify Example</title>
</head>
<body>
<script src="bundle.js"></script>
</body>
</html>
Điều này làm cho mã sử dụng require có thể thực thi trong trình duyệt.
3. So Sánh Webpack và Browserify
| Feature | Webpack | Browserify |
|---|---|---|
| Target projects | Large and complex projects | Small and simple projects |
| Flexibility | Highly extensible with plugins and loaders | Simple and easy configuration |
| ES Modules support | Supported by default | Requires a separate transpiler (e.g., Babel) |
| Performance optimization | Advanced optimization features available | Fewer optimization features |
| Initial learning cost | Higher | Lower |
Môi trường đề xuất:
- Webpack: Tốt nhất cho môi trường phát triển hiện đại và các dự án quy mô lớn.
- Browserify: Tốt nhất cho các công cụ đơn giản, dự án nhỏ và mục đích học tập.
Tóm Tắt
Trong phần này, chúng tôi đã giải thích các ví dụ cài đặt chi tiết cho Webpack và Browserify, những công cụ đóng gói mô-đun được sử dụng rộng rãi.
Tóm tắt nhanh:
- Webpack cung cấp khả năng mở rộng và tối ưu hóa mạnh mẽ, phù hợp cho phát triển quy mô lớn.
- Browserify đơn giản và tốt nhất cho các dự án nhỏ và việc học.
- Trong các trình duyệt hiện đại, bạn cũng nên cân nhắc sử dụng ES Modules.
Trong phần tiếp theo, có tiêu đề “Xây Dựng Dự Án Sử Dụng require,” chúng tôi sẽ giới thiệu một ví dụ thực tế về phát triển ứng dụng.

7. Ví Dụ Thực Hành: Xây Dựng Dự Án Sử Dụng require
Trong phần này, chúng tôi sẽ hướng dẫn một dự án ví dụ cụ thể được xây dựng bằng hàm require. Từ cài đặt cơ bản đến việc sử dụng các thư viện bên ngoài và các mô-đun nội bộ, bạn sẽ học cách sử dụng thực tế với các ví dụ mã thực.
1. Tổng Quan Dự Án
Tên dự án: Ứng Dụng Máy Tính Đơn Giản
Mục tiêu:
- Xây dựng một dự án đơn giản kết hợp các mô-đun nội bộ và các gói bên ngoài.
- Sử dụng hàm
requiređể tách nhiều tính năng thành các mô-đun.
2. Cấu Trúc Dự Án và Cài Đặt Môi Trường
Cấu trúc thư mục:
/calculator-app
├── src/
│ ├── index.js
│ ├── mathModule.js
│ ├── logger.js
├── package.json
├── README.md
Các bước cài đặt:
- Tạo thư mục dự án
mkdir calculator-app cd calculator-app
- Khởi tạo dự án bằng npm
npm init -y
- Cài đặt các gói cần thiết
npm install chalk moment
- chalk : Thư viện để thêm màu sắc vào đầu ra console.
- moment : Thư viện giúp làm việc với ngày và thời gian dễ dàng hơn.
3. Mã Ví Dụ
1. mathModule.js: Một mô-đun cung cấp các tính năng tính toán
module.exports.add = (a, b) => a + b;
module.exports.subtract = (a, b) => a - b;
module.exports.multiply = (a, b) => a * b;
module.exports.divide = (a, b) => {
if (b === 0) {
throw new Error('Cannot divide by 0');
}
return a / b;
};
2. logger.js: Một mô-đun cung cấp các tính năng ghi log
const chalk = require('chalk'); // Colored console output
const moment = require('moment'); // Date/time utility library
module.exports.log = (message) => {
const time = moment().format('YYYY-MM-DD HH:mm:ss');
console.log(chalk.green(`[${time}] ${message}`));
};
3. index.js: Điểm vào của ứng dụng
.
const math = require('./mathModule');
const logger = require('./logger');
// Calculation inputs
const a = 10;
const b = 5;
try {
logger.log(`Addition: ${math.add(a, b)}`);
logger.log(`Subtraction: ${math.subtract(a, b)}`);
logger.log(`Multiplication: ${math.multiply(a, b)}`);
logger.log(`Division: ${math.divide(a, b)}`);
} catch (error) {
console.error(error.message);
}
4. Cách Chạy Dự Án
- Chạy chương trình
node src/index.js
- Kết quả mẫu
[2024-12-30 10:00:00] Addition: 15 [2024-12-30 10:00:00] Subtraction: 5 [2024-12-30 10:00:00] Multiplication: 50 [2024-12-30 10:00:00] Division: 2
Trong ví dụ này, kết quả của máy tính được kết hợp với một mô-đun ghi log, làm cho ứng dụng trở nên thực tiễn hơn và có thể tái sử dụng.
5. Ý tưởng Mở rộng Dự án
- Cải thiện xử lý lỗi
- Bắt và hiển thị lỗi một cách chính xác, chẳng hạn như chia cho 0.
- Thêm tính năng mới
- Tạo một mô-đun cho các hàm lượng giác hoặc tính toán lũy thừa.
Ví dụ: trigModule.js
module.exports.sin = (angle) => Math.sin(angle);
module.exports.cos = (angle) => Math.cos(angle);
module.exports.tan = (angle) => Math.tan(angle);
Ví dụ mở rộng:
const trig = require('./trigModule');
logger.log(`sin(30 degrees): ${trig.sin(Math.PI / 6)}`);
- Giới thiệu tệp cấu hình
- Tạo tệp môi trường/cấu hình để kiểm soát mức độ log và định dạng đầu ra.
6. Tóm tắt Dự án
Trong phần này, chúng tôi đã giới thiệu một ví dụ dự án thực tế được xây dựng bằng hàm require.
Tóm tắt nhanh:
- Chia các tính năng thành các mô-đun để cải thiện khả năng tái sử dụng và bảo trì.
- Kết hợp các gói bên ngoài (chalk, moment) để mở rộng chức năng.
- Cải thiện tính thực tiễn bằng cách tăng cường xử lý lỗi và ghi log.
Bằng cách thêm nhiều tính năng vào dự án này, bạn có thể xây dựng kỹ năng phát triển thực tế thông qua thực hành.
Trong phần tiếp theo, có tiêu đề “Câu hỏi Thường gặp (FAQ)”, chúng tôi sẽ đề cập đến các câu hỏi thường gặp và mẹo khắc phục sự cố liên quan đến hàm require.

8. Câu hỏi Thường gặp (FAQ): Giải quyết các câu hỏi thường gặp về require
Trong phần này, chúng tôi sẽ tóm tắt các câu hỏi và lỗi thường gặp khi sử dụng hàm require. Thông qua việc khắc phục sự cố, bạn sẽ có thể phát triển một cách suôn sẻ và tự tin hơn.
1. Tôi có thể sử dụng require trong môi trường ES6 không?
Trả lời:
Không, hàm require dựa trên hệ thống CommonJS và chủ yếu được sử dụng trong môi trường Node.js. Vì ES Modules đã được chuẩn hoá trong môi trường ES6, nên nên dùng import thay thế.
Ví dụ:
// CommonJS
const fs = require('fs');
// ES Modules
import fs from 'fs';
Điểm quan trọng:
Nếu bạn muốn sử dụng require trong môi trường ES6, có thể cần bật các tùy chọn của Node.js như --experimental-modules hoặc sử dụng một trình biên dịch (như Babel) để duy trì tính tương thích.
2. Tôi nhận được lỗi “module not found” khi sử dụng require. Tôi nên làm gì?
Ví dụ lỗi:
Error: Cannot find module './myModule'
Nguyên nhân:
- Đường dẫn tệp không đúng.
- Bỏ sót phần mở rộng tệp.
- Mô-đun không tồn tại hoặc chưa được cài đặt.
Giải pháp:
- Chỉ định đúng đường dẫn và phần mở rộng tệp.
const myModule = require('./myModule.js'); // Explicitly include the extension
- Nếu là một package, xác nhận đã cài đặt.
npm install module-name
- Kiểm tra các đường dẫn tìm kiếm mô-đun.
console.log(module.paths);
3. Tôi có thể trộn lẫn require và import trong cùng một dự án không?
Trả lời:
Có, trong một số trường hợp bạn có thể trộn lẫn chúng, nhưng cần cẩn thận.
Ví dụ:
const fs = require('fs'); // CommonJS
import path from 'path'; // ES Modules
Lưu ý:
- Nếu bạn đổi phần mở rộng tệp thành
.mjs, không thể sử dụngrequire. - Có thể cần một bundler hoặc trình biên dịch mô-đun để đảm bảo tính tương thích.
4. Tôi có thể sử dụng require một cách động không?
.Answer:
Có, require hỗ trợ nhập động. Đây là một trong những khác biệt lớn nhất so với import.
Example:
if (process.env.NODE_ENV === 'development') {
const debug = require('./debugModule');
debug.log('Development mode');
}
Key point:
- Bạn có thể tải chỉ những mô-đun bạn cần tùy thuộc vào môi trường, điều này hữu ích cho việc phát triển và kiểm thử.
- Vì
importdựa trên phân tích tĩnh, nên nó không hoạt động theo cách này theo mặc định.
5. require.cache là gì?
Answer:
require.cache là một đối tượng được Node.js sử dụng để lưu trữ bộ nhớ đệm các mô-đun. Điều này cải thiện hiệu năng bằng cách ngăn chặn việc tải lại cùng một mô-đun nhiều lần.
Example:
const myModule1 = require('./myModule');
const myModule2 = require('./myModule');
console.log(myModule1 === myModule2); // true
Example: Xóa bộ nhớ đệm
delete require.cache[require.resolve('./myModule')];
Note:
- Nếu bạn xóa bộ nhớ đệm thủ công, hãy cẩn thận với các phụ thuộc của mô-đun.
6. Làm sao tôi có thể sử dụng require trong môi trường trình duyệt mà không hỗ trợ?
Answer:
Trong môi trường trình duyệt, require không thể được sử dụng trực tiếp. Bạn cần một trong các cách tiếp cận sau.
- Sử dụng một bundler mô-đun:
- Đóng gói mã của bạn bằng Webpack hoặc Browserify.
- Sử dụng ES Modules:
- Sử dụng
importgốc thay thế.
Example:
import { add } from './mathModule.js';
console.log(add(3, 4));
HTML file:
<script type="module" src="index.js"></script>
7. Nếu một mô-đun bên ngoài cũ gây lỗi với require thì sao?
Answer:
Các mô-đun cũ có thể không tương thích với các phiên bản mới nhất. Trong trường hợp đó, hãy thử các giải pháp sau.
- Cập nhật mô-đun lên phiên bản mới nhất.
npm update module-name
- Xem xét một thư viện thay thế hỗ trợ các phiên bản mới hơn.
- Sử dụng một trình biên dịch (Babel) để duy trì tính tương thích.
8. Tôi có thể tải các tệp JSON bằng require không?
Answer:
Có, bạn có thể tải các tệp JSON trực tiếp bằng require.
Example:
const data = require('./config.json');
console.log(data.key); // Access values from the JSON
Note:
- Các tệp JSON được tải dưới dạng đối tượng mà không cần phân tích thủ công.
- Trong các phiên bản Node.js gần đây, việc nhập JSON bằng
importcũng khả dụng.
Summary
Trong phần này, chúng tôi đã đề cập đến các câu hỏi thường gặp và câu trả lời về hàm require, tập trung vào sự khác biệt môi trường và cách khắc phục sự cố.
Quick recap:
- Chọn giữa
requirevàimporttùy thuộc vào môi trường. - Chú ý đến đường dẫn tệp và bộ nhớ đệm khi khắc phục sự cố.
- Sử dụng bundler hoặc ES Modules để duy trì tính tương thích với phát triển hiện đại.
Trong phần tiếp theo, có tiêu đề “Summary and Next Steps”, chúng tôi sẽ tổng kết các điểm chính của toàn bộ bài viết và đề xuất các hướng học tiếp theo.

9. Tổng kết và các bước tiếp theo
Trong bài viết này, chúng tôi đã giải thích chi tiết hàm require của JavaScript, từ những kiến thức cơ bản đến các trường hợp sử dụng nâng cao. Trong phần này, chúng tôi sẽ xem lại những gì bạn đã học và đề xuất các bước tiếp theo để nâng cao hiểu biết của bạn.
1. Review of Key Points
- Tại sao quản lý mô-đun lại quan trọng
- Nó giúp dễ dàng chia mã thành các phần có thể tái sử dụng, cải thiện khả năng bảo trì và mở rộng.
- Khái niệm cốt lõi và vai trò của require
requirelà cơ chế tải mô-đun chuẩn trong hệ thống CommonJS.
- Cách sử dụng require với các ví dụ mã thực tế
- Chúng tôi đã trình bày cách nhập các mô-đun tích hợp, mô-đun cục bộ và các gói npm thông qua các ví dụ thực tế.
- Sự khác biệt giữa require và import
- Chúng tôi đã so sánh CommonJS và ES Modules và giải thích cách chọn phương pháp phù hợp tùy thuộc vào môi trường.
- Cách sử dụng require trong trình duyệt
- Chúng tôi đã giải thích cách sử dụng các bundler như Webpack và Browserify để cho phép mã kiểu
requiretrong trình duyệt.
- Ví dụ về việc sử dụng bundler mô-đun
- Chúng tôi đã giới thiệu các ví dụ thiết lập thực tế và giải thích cách các bundler giúp xử lý các phụ thuộc mô-đun.
- Ví dụ xây dựng dự án
- Chúng tôi đã xây dựng một dự án máy tính đơn giản sử dụng
requiređể minh họa việc sử dụng mô-đun trong thực tế.
- Câu hỏi thường gặp và khắc phục sự cố
- Chúng tôi đã tóm tắt các câu hỏi thường gặp và mẹo xử lý lỗi để giúp bạn giải quyết vấn đề hiệu quả hơn.
2. Các bước tiếp theo được đề xuất để học
1. Học ES Modules và các tiêu chuẩn JavaScript hiện đại
Vì ES Modules đang trở thành tiêu chuẩn trong JavaScript hiện đại, bạn nên khám phá sâu hơn về import và export.
- Các chủ đề đề xuất: Import động, xuất mặc định và xuất có tên.
- Công nghệ liên quan: Quản lý mô-đun với TypeScript và định nghĩa kiểu.
2. Sử dụng nâng cao các bundler mô-đun
Tìm hiểu cách tối ưu hoá quá trình xây dựng và cấu hình plugin bằng các công cụ như Webpack hoặc Vite.
- Các lĩnh vực trọng tâm: Phân chia mã, tree shaking và tối ưu hoá bộ nhớ đệm.
3. Tích hợp với phát triển phía máy chủ
Khám phá việc xây dựng máy chủ API và tích hợp cơ sở dữ liệu bằng Node.js và require.
- Các ví dụ nâng cao: Xây dựng REST API bằng Express hoặc Fastify.
4. Áp dụng các framework JavaScript hiện đại
Củng cố quản lý mô-đun bằng cách làm việc với các framework front-end như React hoặc Vue.js.
- Ví dụ: Triển khai quản lý trạng thái với React Hooks và Context API.
5. Cải thiện kỹ năng kiểm thử và gỡ lỗi
Học các kỹ thuật kiểm thử và gỡ lỗi ở mức mô-đun để viết mã đáng tin cậy hơn.
- Công cụ đề xuất: Kiểm thử đơn vị với Jest hoặc Mocha.
3. Tài nguyên và tham khảo bổ sung
- Tài liệu chính thức:
- Node.js Official Website
- MDN Web Docs – JavaScript Modules
- Nền tảng học trực tuyến:
- Codecademy – Node.js Courses
- Udemy – Module Management and Bundling Tools
- Kho mã thực hành:
- Cải thiện kỹ năng thực hành của bạn bằng cách khám phá các dự án mã nguồn mở trên GitHub.
4. Tóm tắt cuối cùng
require là một phần cốt lõi của quản lý mô-đun trong Node.js và đóng vai trò quan trọng trong việc cải thiện khả năng tái sử dụng và bảo trì mã. Tuy nhiên, ES Modules hiện đã được tiêu chuẩn hoá trong JavaScript hiện đại, vì vậy việc lựa chọn phương pháp phù hợp tùy thuộc vào mục tiêu và môi trường dự án của bạn là điều cần thiết.
Những điểm học chính:
- Sâu sắc hơn hiểu biết của bạn về các tiêu chuẩn quản lý mô-đun hiện đại.
- Sử dụng các bundler mô-đun để xây dựng môi trường phát triển hiệu quả.
- Áp dụng kỹ năng của bạn qua các dự án thực tế và phát triển trong thế giới thực.
Hãy sử dụng bài viết này làm nền tảng để củng cố kỹ năng quản lý mô-đun JavaScript của bạn và xây dựng các ứng dụng mở rộng hơn. Chúc may mắn trong hành trình phát triển JavaScript tương lai của bạn!
10. Tóm tắt cuối cùng và tích hợp toàn bộ phần
Trong bài viết này, chúng tôi đã đề cập đến quản lý mô-đun JavaScript bằng hàm require, từ các khái niệm cơ bản đến việc sử dụng nâng cao. Ở đây, chúng tôi sẽ tóm tắt những gì bạn đã học qua tất cả các phần và đề xuất các bước tiếp theo.
Xem lại các điểm chính
- Tại sao quản lý module lại quan trọng Quản lý module cải thiện khả năng tái sử dụng mã và làm cho các dự án dễ dàng bảo trì và mở rộng hơn. Bằng cách sử dụng
require, bạn có thể chia mã JavaScript thành các module chức năng và phát triển hiệu quả hơn. - Cơ bản về hàm require
requiredựa trên hệ thống module CommonJS và chủ yếu được sử dụng trong môi trường Node.js. Bạn đã học phương pháp cốt lõi để nhập module. - Sự khác biệt giữa require và import Cả
requirevàimportđều hỗ trợ quản lý module, nhưngrequirethuộc về CommonJS của Node.js, trong khiimportthuộc về ES Modules. Việc chọn cái nào đúng phụ thuộc vào môi trường và yêu cầu dự án của bạn. - Cách sử dụng require trong trình duyệt Vì
requirekhông hoạt động trực tiếp trong trình duyệt, bạn đã học cách sử dụng các bundler module (Webpack và Browserify) như một giải pháp. Trong phát triển hiện đại, ES Modules cũng được sử dụng rộng rãi. - Ví dụ dự án thực tế Bạn đã xây dựng một dự án máy tính đơn giản sử dụng
require, bao gồm tạo module, nhập và xử lý lỗi. Điều này giúp bạn phát triển các kỹ năng phát triển thực tế thiết yếu. - Khắc phục sự cố Bạn đã học các giải pháp cho các lỗi và vấn đề phổ biến liên quan đến
require, cho phép giải quyết vấn đề mượt mà hơn trong các tình huống phát triển thực tế. - Các bước tiếp theo Từ đây, bạn nên khám phá ES Modules, các bundler hiện đại (Webpack, Vite), và áp dụng các kỹ năng này vào các dự án thực tế. Bạn cũng có thể mở rộng vào phát triển phía server và các framework front-end.
Tập Trung Học Tập Khuyến Nghị Tiếp Theo
- Đi sâu hơn vào ES Modules Kể từ ES6,
importvàexportđã trở thành tiêu chuẩn và được sử dụng rộng rãi trong trình duyệt và Node.js. Hãy đảm bảo làm chủ ES Modules một cách kỹ lưỡng. - Sử dụng module bundlers hiệu quả Học cách sử dụng các công cụ như Webpack và Vite để xây dựng môi trường phát triển hiệu quả. Đặc biệt, học các kỹ thuật tối ưu hóa như code splitting và tree shaking rất có lợi.
- Phát triển phía server và tạo API Hãy quen thuộc với việc xây dựng API bằng Node.js. Học các framework như Express hoặc Fastify được khuyến nghị.
- Học các framework front-end Sử dụng các framework phổ biến như React hoặc Vue.js để xây dựng ứng dụng front-end hiện đại. Quản lý module là một khái niệm chính trong các hệ sinh thái này.
- Cải thiện kỹ năng kiểm thử và gỡ lỗi Học unit testing với các công cụ như Jest hoặc Mocha để viết mã đáng tin cậy và dễ bảo trì.
Tài Nguyên Bổ Sung và Nền Tảng Học Tập
- Tài liệu chính thức Node.js: Trang web Chính thức Node.js
- MDN Web Docs – Các Module JavaScript: MDN Web Docs – Các Module JavaScript
- Nền tảng học tập trực tuyến: Codecademy – Học Node.js Udemy – Các khóa học về quản lý module và công cụ bundling
- GitHub: Sử dụng các dự án mã nguồn mở để học các mẫu mã thực tế và cách sử dụng thư viện.
Tóm Tắt Cuối Cùng
Qua hướng dẫn này, bạn giờ đây nên có sự hiểu biết vững chắc về quản lý module sử dụng hàm require và có thể xử lý nhiều tình huống phổ biến. Tiếp theo, hãy tiếp tục học các công cụ mới và tiêu chuẩn hiện đại, và áp dụng chúng vào các dự án thực tế để cải thiện kỹ năng của bạn. Sự hiểu biết sâu sắc về quản lý module là một trong những bước quan trọng nhất hướng tới việc viết mã JavaScript sạch sẽ, hiệu quả và có thể mở rộng.
Hãy tiếp tục học và xây dựng—cảm ơn bạn đã đọc!


