module.exports và exports trong NodeJS khác nhau như thế nào?
node.js
2
White

Nguyên Hoàng viết ngày 08/11/2019

Chú ý

exportsmodule.exports chứ không phải là export nhé các bạn. Nhiều bạn hay viết thiếu chữ "s" lắm ấy. Trong Javascript thì có cái từ khóa export nhưng trong NodeJS thì chưa đâu.

Cơ chế Wrapping của NodeJS là gì?

Trước khi một đoạn code trong module được thực thi thì NodeJS sẽ wrap code lại như sau:

(function(exports, require, module, __filename, __dirname) { 
    // Module code actually lives in here 
}); 

module.exports và exports khác nhau như thế nào?

Trước hết thì module.exportsexports trỏ tới cùng một Object, là một Object rỗng.

Tuy nhiên, chỉ có một thằng module.exports là cái thật sự được export khi mình require nó thôi. Còn thằng exports thì không phải. Nó chỉ là một reference tới thằng module.exports thôi.

Ví dụ như sau:

module.exports.name = "Nguyen";
exports.name = "Nguyen";

console.log(module.exports);
console.log(exports);
console.log(module.exports === exports);

Kết quả sẽ là

{ name: 'Nguyen' }
{ name: 'Nguyen' }
true

Ở đây có thể thấy hai thằng này chỉ thay đổi cái properties của cái Object ban đầu (là Object rỗng ban đầu). Nên ở đây, hai thằng này vẫn là cùng một Object.

Tuy nhiên, nếu như sửa lại

module.exports = {
  name: "Nguyen"
};
exports = {
  name: "Nguyen"
};

console.log(module.exports === exports);

Hai thằng này là hai cái Object khác nhau, vì mình là assign lại giá trị cho thằng exports (Mình dùng dấu =).Kết quả sẽ là

false

Mình chứng minh thêm như sau:

Trong file export.js minhf viết

exports = {
  name: "Nguyen"
};

Sau đó, trong file index.js mình viết

const object = require("./export");

console.log(object);

Thì kết quả là {}

Vì chỉ là thằng module.exports mới là thằng thật sự được export (Và mặc định nó là một Object rỗng). Còn thằng exports thì không.

Vậy thì khi nào sử dụng thằng exports?

Dùng thằng exports chỉ khi nào mình muốn add thêm một cái properties vào cái Object mặc định của nó. Ví dụ như thay vì viết

exports.x = 1;
exports.y = 2;
exports.z = 3;

Thì có thể viết thành như sau cho nó ngắn và tiện hơn.

module.exports.x = 1;
module.exports.y = 2;
module.exports.z = 3;

Kết luận

Luôn sử dụng module.exports khi muốn export một cái gì đó. Đừng lăn tăn sử dụng exports là gì cho rối rắm hết cả lên.

Hiện tại mình đang tập tọe viết Blog ở địa chỉ https://htknguyen.com/. Nếu bạn nào có hứng thú thì ghé vào blog của mình nghe mình chém gió loạn lên dưới góc độ một thằng Developer cùi nhé. Bắn tim

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Nguyên Hoàng

4 bài viết.
19 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
8 1
Responsive ngày này gần như là yêu cầu bắt buộc phải có khi thiết kế Website. Tuy nhiên, mỗi khi truy cập vào (Link) thì giao diện y như những tran...
Nguyên Hoàng viết 28 ngày trước
8 1
White
3 0
Nhắc đến nhận diện gương mặt thì nhắc đến một cái gì đó đao to búa lớn như là Machine Learning cùng với một số thuận ngữ mang tầm vĩ mô như Deep Le...
Nguyên Hoàng viết 1 tháng trước
3 0
Bài viết liên quan
White
1 0
CakePHP vs Node.js : Which one to choose for web application development? PHP came into limelight after internet took centerstage in the early 200...
Leena joseph viết hơn 2 năm trước
1 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
4 bài viết.
19 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!