Javascript : Sự khác biệt giữa module.exports và exports - QuânSysAd's Blog

04 tháng 9 2018

Javascript : Sự khác biệt giữa module.exports và exports

Không hề có ma thuật gì ở đây. Module code của bạn được kẹp giữa 2 items trong array này và nó tương đương.
NativeModule.wrapper = [
  '(function (exports, require, module, __filename, __dirname) { ',
'\n});'
];
Các biến magic bạn có thể sử dụng trong các module: exports, require, module, __filename, và __dirname là không magic, chúng chỉ là các tham số tới function mà được gọi khi module được load.
Lúc ban đầu, exportsmodule.exports trỏ tới cùng một empty object.
Image
Bạn có thể thêm các thuộc tính vào object này sử dụng module.exports hoặc là dùng exports do chúng cùng trỏ tới cùng một object, tức là không quan trọng bạn dùng cái nào.
Nếu bạn thêm exports.foo = "bar"module.exports.baz = "boz" thì object được export của module sẽ như sau:
{foo: "bar", baz: "boz"}
nhưng, nếu bạn muốn export function, hoặc string, hoặc unicorn thì sao ?
Thì đây chính là sự khác biệt quan trọng giữa exportsmodule.exports.
Nếu bạn có trí nhớ kém thì chỉ cần dùng module.exports cho nhanh. Đỡ nghĩ nhiều.
Có nghĩa là bất cứ thứ gì được gán cho module.exports là object thì nó sẽ được exports ra khỏi module.
Nếu bạn muốn export function từ module của bạn và bạn gán nó vào exports mà không phải module.exports thì điều này sẽ xảy ra:
Image
Bất ngờ chưa, module của bạn sẽ export empty object, không phải function mà bạn có lẽ định export.
Nếu bạn muốn export cái gì đó thay vì empty object và bạn muốn sử dụng exports ở một nơi nào khác trong module, bạn sẽ phải cần gán lại đồng thời cả hai.
exports = module.exports = function () {/* ... */}
exports.foo = "bar"

Không có nhận xét nào: