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

Explicación detallada de la diferencia entre exports y module.exports en nodejs

require se utiliza para cargar código, mientras que exports y module.exports se utilizan para exportar código. Pero muchos principiantes pueden sentirse confundidos sobre la diferencia entre exports y module.exports, para entender mejor la relación entre exports y module.exports, primero fortalezcamos las bases de js. Ejemplo:

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);

El resultado de ejecutar app.js es:

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

Explicación:a es un objeto, b es una referencia a a, es decir, a y b apuntan al mismo objeto, es decir, a y b apuntan a la misma dirección de memoria, por lo que las dos primeras salidas son iguales. Cuando se realiza una modificación en b, es decir, cuando el contenido de la dirección de memoria a la que apuntan a y b cambia, también se reflejará en a, por lo que las terceras y cuartas salidas son iguales. Cuando se sobrescribe completamente b, b apunta a una nueva dirección de memoria (sin modificar el bloque de memoria original), a sigue apuntando al bloque de memoria original, es decir, a y b ya no apuntan a la misma dirección de memoria, lo que significa que en este momento a y b ya no tienen relación alguna, por lo que las últimas dos salidas son diferentes.

Después de entender el ejemplo anterior, entramos en materia.

Sólo necesitamos saber tres puntos para entender la diferencia entre exports y module.exports:

  • exports es una referencia a module.exports
  • El valor inicial de module.exports es un objeto vacío {}; por lo tanto, el valor inicial de exports también es {}
  • require() devuelve module.exports y no exports

Por lo tanto: a través de

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

Asignar valores a exports es realmente agregar dos propiedades al objeto vacío module.exports, el código anterior es equivalente a:

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

Generalmente usamos exports y module.exports de esta manera

Un ejemplo simple para calcular el área del 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;
}

Los dos ejemplos anteriores tienen la misma salida. Tal vez te preguntes, ¿por qué no escribirlo de esta manera?

app.js

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

area.js

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

Ejecutar el ejemplo anterior generará un error. Esto se debe a que, en el ejemplo anterior, al agregar propiedades a exports, solo se modificó el espacio en memoria al que apunta exports, y

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

En realidad es una sobrescripción de exports, lo que significa que exports apunta a un nuevo espacio en memoria (que contiene una función para calcular el área del círculo), lo que significa que exports y module.exports ya no apuntan al mismo espacio en memoria, lo que significa que en este momento exports y module.exports no tienen ninguna relación, lo que significa que el espacio en memoria al que apunta module.exports no ha cambiado en absoluto, sigue siendo un objeto vacío {} , lo que significa que area.js ha exportado un objeto vacío, por lo que cuando llamamos a area en app.js,4Se produce el error TypeError: object is not a function.

Por lo tanto, haremos una小结: cuando queremos que el módulo exporte un objeto, exports y module.exports pueden utilizarse (pero exports no puede ser sobreescrito como un nuevo objeto), y cuando queremos exportar una interfaz no objetual, solo podemos y debemos cubrir module.exports.

A menudo vemos esta escritura:

exports = module.exports = somethings;

El código anterior es equivalente a

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

La razón también es muy simple, module.exports = somethings es una sobreescritura de module.exports, en este momento, la relación entre module.exports y exports se rompe, module.exports apunta a un nuevo bloque de memoria, mientras que exports aún apunta al bloque de memoria original. Para que module.exports y exports apunten a un mismo bloque de memoria o a un mismo “objeto”, por lo que exports = module.exports.

Eso es todo el contenido de este artículo. Esperamos que el contenido de este artículo pueda proporcionar cierta ayuda en su aprendizaje o trabajo, y también esperamos que apoyen mucho al tutorial de gritos!

Declaración: El contenido de este artículo se ha obtenido de Internet, y pertenece a los propietarios originales. El contenido ha sido proporcionado voluntariamente por los usuarios de Internet y subido por ellos mismos. Este sitio no posee los derechos de propiedad, no ha sido editado artificialmente y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, le invitamos a enviar un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @) para denunciar, y proporcionar evidencia relevante. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará