risposta di Renee è ben spiegato. Aggiunta alla risposta con un esempio:
Il nodo fa un sacco di cose al tuo file e uno dei più importanti è WRAPPING il tuo file. All'interno del codice sorgente nodejs viene restituito "module.exports". Facciamo un passo indietro e comprendiamo il wrapper. Supponiamo di avere
greet.js
var greet = function() {
console.log('Hello World');
};
module.exports = greet;
il codice precedente è avvolto come IIFE (Subito Richiamato espressione di funzione) all'interno nodejs codice sorgente come segue:
(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
e la suddetta funzione viene richiamata (.apply()) e restituito module.exports. In questo momento module.exports ed export puntano allo stesso riferimento.
Ora, immaginate di riscrivere greet.js come
exports = function() {
console.log('Hello World');
};
console.log(exports);
console.log(module.exports);
l'uscita sarà
[Function]
{}
il motivo è: module.exports è un oggetto vuoto. Non abbiamo impostato nulla su module.exports, piuttosto impostiamo exports = function() ..... in new greet.js. Quindi, module.exports è vuoto.
Tecnicamente le esportazioni e module.exports devono puntare allo stesso riferimento (è corretto !!). Ma usiamo "=" quando assegniamo function() .... alle esportazioni, che crea un altro oggetto nella memoria. Quindi, module.exports ed export producono risultati diversi. Quando si tratta di esportazioni, non possiamo ignorarlo.
Ora, immaginate di ri-scrittura (questo è chiamato Mutation) greet.js (riferendosi a Renee risposta) come
exports.a = function() {
console.log("Hello");
}
console.log(exports);
console.log(module.exports);
l'uscita sarà
{ a: [Function] }
{ a: [Function] }
Come si può vedere module.exports ed export puntano allo stesso riferimento che è una funzione. Se imposti una proprietà sulle esportazioni, questa verrà impostata su module.exports perché in JS gli oggetti passano per riferimento.
Conclusione è sempre utilizzare module.exports per evitare confusione. Spero che questo aiuti. Felice codifica :)
Usa sempre 'module.exports'. –
Penso che il seguente consiglio sopra suggerito permette di evitare questo problema. –
@GabrielLlamas, quindi perché molti pacchetti utilizzano solo "esportazioni", ad esempio https://github.com/tj/consolidate.js/blob/master/lib/consolidate.js? – CodyBugstein