Node.js module.exports frente a exportaciones

Qué son, cómo usarlos y cómo no usarlos

(Tenga en cuenta que este artículo se escribió después de la versión 6.1.0 de Node.js)

TL; DR

  • Piense en module.exports como la variable que se devuelve de require (). Es un objeto vacío por defecto y está bien cambiarlo a cualquier cosa.
  • Exportaciones Bueno, ¡las "exportaciones" en sí mismas nunca se devuelven!Es solo una referencia a module.exports; una variable de conveniencia para ayudar a los autores de módulos a escribir menos código. Trabajar con sus propiedades es seguro y recomendable.
exports.method = function() {…} 
vs.
module.exports.method = function() {…}

Un ejemplo de módulo simple

Primero, necesitamos una base de código de ejemplo. Comencemos con una calculadora simple:

Uso:

La envoltura del módulo

Node.js envuelve internamente todos los módulos require () - ed en un contenedor de funciones:

El objeto del módulo

La variable " módulo " es un objeto que representa el módulo actual. Que es local para cada módulo y también es privada (sólo accesible desde el código del módulo):

Módulo.exportaciones

  • Es la referencia de objeto que se devuelve de las llamadas require ().
  • Es creado automáticamente por Node.js.
  • Es solo una referencia a un objeto JavaScript simple.
  • También está vacío por defecto (nuestro código le adjunta un método "add ()")

Hay dos formas de usar module.exports:

  1. Adjuntando métodos públicos (como hicimos en el ejemplo de la calculadora).
  2. Sustitución de que con nuestro objeto o función personalizada.

¿Por qué reemplazarlo? Al reemplazar, podemos devolver cualquier instancia arbitraria de alguna otra clase. Aquí hay un ejemplo escrito en ES2015:

Arriba, "calculator-base" exporta una clase.

Extendamos la clase "Calculadora" y exportemos una instancia esta vez:

Uso:

Exportaciones alias

  • "Exportaciones" es solo una variable de conveniencia para que los autores de módulos puedan escribir menos código
  • Trabajar con sus propiedades es seguro y recomendable.

    (por ejemplo: exportaciones.add = función…)

  • Las exportaciones NO son devueltas por require () (¡module.exports sí lo es!)

Aquí hay algunos buenos y malos ejemplos:

Nota: Es una práctica común reemplazar module.exports con funciones u objetos personalizados. Si hacemos eso, pero aún nos gustaría seguir usando la abreviatura de "exportaciones"; luego, las "exportaciones" deben volver a apuntar a nuestro nuevo objeto personalizado (también hecho en el código anterior en la línea 12):

exports = module.exports = {}
exports.method = function() {...}

Conclusión

Una variable denominada exportaciones que no se exporta por completo es confusa, especialmente para los recién llegados a Node.js. Incluso la documentación oficial también tiene una versión un poco extraña:

Como pauta, si la relación entre exportaciones y module.exports le parece mágica, ignore las exportaciones y utilice únicamente module.exports.

Mi opinión es que el código no es mágico. Los desarrolladores siempre deben buscar una comprensión más profunda de las plataformas y los lenguajes que utilizan. Al hacerlo; Los programadores obtienen una confianza y un conocimiento valiosos que, a su vez, impactan positivamente en la calidad del código, la arquitectura del sistema y la productividad.

Gracias por leer mi publicación. Los comentarios y pensamientos siempre son bienvenidos en la sección de comentarios.

lazlojuly

Artículos relacionados:

  • ¿Los módulos de Node.js son singleton?

Fuentes:

  • Documentación de Node.js sobre módulos

Consulte mi nueva serie de blogs sobre pruebas unitarias:

¿Cómo empezar con las pruebas unitarias? Parte 1

Supongo que muchos de nosotros podemos relacionarnos con una situación descrita anteriormente.

Un lugar donde las pruebas unitarias se consideran una tarea ardua. medium.com