English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Explicação detalhada da diferença entre exports e module.exports no nodejs

O require é usado para carregar código, enquanto exports e module.exports são usados para exportar código. No entanto, muitos iniciantes podem se confundir com a diferença entre exports e module.exports, para entender melhor a relação entre exports e module.exports, vamos reforçar um pouco as bases do js. Exemplo:

app.js

var a = {name: 'nswbmw 1}
var b = a;
console.log(a);
console.log(b);
b.name = 'nswbmw 2';
console.log(a);
console.log(b);
var b = {name: 'nswbmw 3}
console.log(a);
console.log(b);

O resultado da execução do app.js é:

{ name: 'nswbmw 1}
{ name: 'nswbmw 1}
{ name: 'nswbmw 2}
{ name: 'nswbmw 2}
{ name: 'nswbmw 2}
{ name: 'nswbmw 3}

Explicação:a é um objeto, b é uma referência para a, ou seja, a e b apontam para o mesmo objeto, ou seja, a e b apontam para o mesmo endereço de memória, então as duas primeiras saídas são iguais. Quando modificamos b, ou seja, o conteúdo do endereço de memória apontado por a e b muda, então a também reflete isso, então as terceiras e quartas saídas são iguais. Quando b for completamente substituído, b apontará para um novo endereço de memória (não foi feita nenhuma modificação no bloco de memória original), a ainda apontará para o bloco de memória original, ou seja, a e b não apontarão para o mesmo bloco de memória, o que significa que, neste momento, a e b não têm mais nenhuma relação, então as duas últimas saídas são diferentes.

Após entender o exemplo acima, vamos abordar o tema principal.

Para entender a diferença entre exports e module.exports, precisamos saber três pontos principais:

  • exports é uma referência para o module.exports
  • A variável module.exports tem um valor inicial de um objeto vazio {} e, portanto, a variável exports também tem um valor inicial vazio {}
  • require() retorna module.exports e não exports

Portanto: nós passamos

var name = 'nswbmw';
exports.name = name;
exports.sayName = function() {
 console.log(name);
}

Atribuir valores a exports é, na verdade, adicionar duas propriedades ao objeto vazio module.exports, o código acima é equivalente a:

var name = 'nswbmw';
module.exports.name = name;
module.exports.sayName = function() {
 console.log(name);
}

Nós geralmente usamos exports e module.exports assim

Um exemplo simples, calcular a área do círculo:

Uso de exports

app.js

var circle = require('./circle');
console.log(circle.area(4));

circle.js

exports.area = function(r) {
 return r * r * Math.PI;
}

Uso de module.exports

app.js

var area = require('./area');
console.log(area(4));

area.js

module.exports = function(r) {
 return r * r * Math.PI;
}

Os dois exemplos acima têm a mesma saída. Você talvez pergunte, por que não escrever assim?

app.js

var area = require('./area');
console.log(area(4));

area.js

exports = function(r) {
 return r * r * Math.PI;
}

A execução do exemplo acima gerará um erro. Isso ocorre porque, no exemplo anterior, adicionamos atributos ao exports, o que apenas modificou a memória apontada por exports, mas

exports = function(r) {
 return r * r * Math.PI;
}

Na verdade, é uma sobreposição de exports, o que significa que exports aponta para uma nova memória (contendo uma função para calcular a área do círculo), o que significa que exports e module.exports não apontam para a mesma memória, o que significa que, neste momento, exports e module.exports não têm nenhuma relação, o que significa que a memória apontada por module.exports não foi alterada e continua sendo um objeto vazio {} , o que significa que area.js exportou um objeto vazio, então, quando chamamos area no app.js,4Ocorrerá um erro TypeError: object is not a function.

Portanto, faça uma breve resumo: quando queremos que o módulo exporte um objeto, exports e module.exports podem ser usados (mas exports também não pode ser reescrevido como um novo objeto), e quando queremos exportar uma interface não-objeto, é necessário e apenas para cobrir module.exports.

Nós vemos frequentemente essa escrita:

exports = module.exports = somethings;

O código acima é equivalente a

module.exports = somethings;
exports = module.exports;

A razão é很简单,module.exports = somethings é uma sobreposição de module.exports, neste momento, a relação entre module.exports e exports é quebrada, module.exports aponta para um novo bloco de memória, enquanto exports ainda aponta para o bloco de memória original. Para que module.exports e exports ainda apontem para o mesmo bloco de memória ou para o mesmo 'objeto', então exports = module.exports.

Isso é tudo sobre o conteúdo deste artigo. Espero que o conteúdo deste artigo ajude você a aprender ou a trabalhar. Também esperamos que você dê mais apoio ao tutorial de gritos!

Declaração: o conteúdo deste artigo é extraído da Internet, pertencente ao autor original, carregado voluntariamente pelos usuários da Internet, o site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade legal. Se você encontrar conteúdo suspeito de infringir direitos autorais, por favor, envie e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar, e forneça provas relevantes. Se confirmado, o site deletará imediatamente o conteúdo suspeito de infringir direitos autorais.)

Você também pode gostar