Node.js sử dụng CommonJS để triển khai hệ thống module và require
là lệnh để yêu cầu sử dụng một module trong một file xác định. Chức năng cơ bản của require
đó là nó sẽ đọc một file, thực thi và sau đó trả lại các đối tượng được exports
.
Ví dụ một module như sau:
console.log("example.js");
const invisible = function () {
console.log("invisible");
}
exports.message = "hi";
exports.say = function () {
console.log(exports.message);
}
Khi đó:
var example = require('./example.js')
console.log(example);
Chúng ta sẽ thấy kết quả như là:
example.js
{
message: "hi",
say: [Function]
}
Hoặc chúng ta cũng có thể sử dụng module.exports
để exports ra một hàm hoặc một đối tượng mới.
Ví dụ:
module.exports = function () {
console.log("hello world");
}
Khi đó
require('./example2.js')(); // return "hello world"
Một điều cần lưu ý là mỗi lần require
một tệp đã được require trước đó, các đối tượng được exports sẽ được lưu vào bộ nhớ đệm (cache) và sử dụng lại.
Ví dụ:
node> require('./example.js')
example.js
{ message: 'hi', say: [Function] }
node> require('./example.js')
{ message: 'hi', say: [Function] }
node> require('./example.js').message = "hey" // gán message thành "hey"
'hey'
node> require('./example.js') // lúc này chúng ta sẽ nghĩ require giống như là yêu cầu require mới lại file...
example.js
{ message: 'hey', say: [Function] } // nhưng kết quả message đã bị gán thành "hey"
Như các bạn có thể thấy ở trên, example.js được require
một lần duy nhất, sau đó tất cả các lệnh gọi require tiếp theo sẽ chỉ lấy ra trong bộ nhớ đệm, thay vì đọc lại tệp. Điều này đôi khi có thể tạo ra một số trường hợp không mong muốn như ở ví dụ trên khi chúng ta vô tình thay đổi các thuộc tính.
Các quy tắc về require
có thể hơi phức tạp, nhưng có một số quy tắc chung đơn giản như là nếu tệp không bắt đầu bằng "./" hoặc "/", thì nó được coi là built-in module (core), hoặc là một phần phụ thuộc trong thư mục node_modules. Nếu tệp bắt đầu bằng "./" thì nó được coi là tệp với đường dẫn tương đối. Nếu tệp bắt đầu bằng "/", nó được coi là tệp với đường dẫn tuyệt đối.
Lưu ý: có thể bỏ qua đuôi ".js", require sẽ tự động thêm vào nếu cần.
Ngoài ra, nếu chúng ta require
chỉ đến cấp thư mục nó sẽ tự động tìm file index.js, nếu không có sẽ gây ra một lỗi module không tồn tại.
Bí mật ngăn xếp của Blog
Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!
Đăng ký nhận thông báo bài viết mới
Xin chào, tôi tên là Hoài - một anh Dev kể chuyện bằng cách viết ✍️ và làm sản phẩm 🚀. Với nhiều năm kinh nghiệm lập trình, tôi đã đóng góp một phần công sức cho nhiều sản phẩm mang lại giá trị cho người dùng tại nơi đang làm việc, cũng như cho chính bản thân. Sở thích của tôi là đọc, viết, nghiên cứu... Tôi tạo ra trang Blog này với sứ mệnh mang đến những bài viết chất lượng cho độc giả của 2coffee.dev.Hãy theo dõi tôi qua các kênh LinkedIn, Facebook, Instagram, Telegram.
Bình luận (2)