odpowiedź Renee jest dobrze wyjaśnione. Dodatek do odpowiedzi na przykładzie:
Węzeł ma wiele rzeczy do pliku i jednym z ważniejszych jest WRAPOWANIE pliku. Wewnątrz nodejs zwracany jest kod źródłowy "module.exports". Zróbmy krok do tyłu i zrozumiemy opakowanie. Załóżmy, że masz
greet.js
var greet = function() {
console.log('Hello World');
};
module.exports = greet;
powyższy kod jest owinięty jak Iife (Natychmiast Wykonano Expression Function) wewnątrz nodejs kodu źródłowego, co następuje:
(function (exports, require, module, __filename, __dirname) { //add by node
var greet = function() {
console.log('Hello World');
};
module.exports = greet;
}).apply(); //add by node
return module.exports; //add by node
i powyższa funkcja jest wywoływana (.apply()) i zwrócił moduł.exports. W tym czasie moduł wyeksportuje i eksportuje wskazując to samo odwołanie.
Teraz wyobraź sobie, że re-write greet.js jak
exports = function() {
console.log('Hello World');
};
console.log(exports);
console.log(module.exports);
wyjście będzie
[Function]
{}
powodem jest: module.exports jest pusty obiekt. Nie ustawiliśmy niczego w module.exports, a raczej ustawiamy exports = function() ..... w nowym pliku greet.js. Tak więc moduł.exports jest pusty.
Technicznie eksport i moduł.export powinien wskazywać na to samo odniesienie (to jest poprawne !!). Ale używamy "=" podczas przypisywania funkcji() .... do eksportu, co tworzy kolejny obiekt w pamięci. Tak więc moduł .exports i exports dają różne wyniki. Jeśli chodzi o eksport, nie możemy go przesłonić.
Teraz wyobraź sobie, że re-write (nazywa się to Mutacja) greet.js (odnosząc się do Renee odpowiedzi) jako
exports.a = function() {
console.log("Hello");
}
console.log(exports);
console.log(module.exports);
wyjście będzie
{ a: [Function] }
{ a: [Function] }
Jak widać module.exports i exports wskazują na to samo odwołanie, które jest funkcją. Jeśli ustawisz właściwość eksportu, to zostanie ustawiona na module.exports, ponieważ w JS obiekty są przekazywane przez odniesienie.
Wniosek jest zawsze używany module.exports, aby uniknąć nieporozumień. Mam nadzieję, że to pomoże. Szczęśliwe kodowanie :)
Zawsze używaj 'module.exports'. –
Myślę, że przestrzeganie powyższych wskazówek pozwala uniknąć tego problemu. –
@GabrielLlamas, dlaczego więc wiele pakietów używa po prostu 'exports', na przykład https://github.com/tj/consolidate.js/blob/master/lib/consolidate.js? – CodyBugstein