Tìm hiểu về require trong Node.js

Tìm hiểu về require trong Node.js

Tin ngắn hàng ngày dành cho bạn
  • Lại có thêm một công cụ hỗ trợ tìm kiếm nhanh lịch sử gõ lệnh nè mọi người: atuinsh/atuin.

    Điều thú vị là nó dùng SQLite để lưu trữ. Ngoài ra còn cung cấp tính năng đồng bộ hóa (mã hóa) hoàn toàn lịch sử giữa các máy với nhau nữa. Hay ghê 🤓

    » Xem thêm
  • Mình thấy ấn tượng với mô hình gemma-3n-E4B của nhà Google ghê. Đây là một trong những mô hình hứa hẹn mang các mô hình ngôn ngữ lớn xuống chạy trên thiết bị di dộng hoặc web hoặc nhúng (embedded)...

    Cảm giác nó hiểu lời nhắc hơn á, tại vì mình thử nhiều mô hình ít tham số mà nó hay lơ đi lời nhắc của mình. Ví dụ bảo: "Chỉ trả về câu trả lời, không cần giải thích gì thêm" thì rất nhiều cái vẫn cứ phải chêm vào câu mở đầu, giải thích... còn với gemma-3n thì trả lời rất đúng trọng tâm.

    » Xem thêm
  • Trước là sử dụng CSS để tạo hiệu ứng "loading", còn giờ có thể chỉ cần mỗi 1 tệp svg cũng "loading" được luôn: svg-loaders

    » Xem thêm

Vấn đề

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.

Cao cấp
Hello

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!

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!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (2)

Nội dung bình luận...
Avatar
Ẩn danh1 năm trước

Cho tôi hỏi là có thể exports một hằng số được không

Trả lời
Avatar
Xuân Hoài Tống1 năm trước

Được bạn. Trong JavaScript/Node.js hầu như dữ liệu gì cũng có thể exports được bạn ạ.

Avatar
Trịnh Cường4 năm trước

Bài viết rất bổ ích.cảm ơn tác giả nhiều

Trả lời