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