Los módulos para Node JS son Singletons

Los módulos de NPM una vez llamado pasan al cache del proceso convirtiéndose de esa manera en Singleton.

Rodríguez Patiño, Eduardo
2020-10-27 | 349 lecturas

En esta nueva entrada vamos hablar acerca de los módulos en NPM.

¿Qué son?

Los módulos en si, nos permiten organizar nuestro código para hacer un sistema más modular en vez de tener todo el código puesto en un solo script.

Por ejemplo, esto sería la definición básica de un módulo.

class SomethingAwesome { }

module.exports = new SomethingAwesome();

Y su llamada sería la siguiente

const somethingAwesome require('./myClass.js');

¿Por que dicen que es Singleton?

Porque al llamar un módulo este forma parte del cache del proceso de nuestra aplicación, por ende la segunda vez que llamemos a nuestro módulo vendrá del cache.

Pequeño ejercicio

Como bien ustedes saben, las instancias de una clase siempre serán objetos únicos.

class SomethingAwesome {}

const a = new SomethingAwesome(),
      b = new SomethingAwesome();

console.log(a === b);

El resultado del ejercicio anterior será false, porque como mencione las instancias siempre son únicas. Sino me creen, pueden probar el código en la consola del browser y corroborarlo por ustedes mismos.

Que pasaría ..

Si hacemos lo mismo pero llamando al módulo 2 veces.

class SomethingAwesome { }

module.exports = new SomethingAwesome();

Este módulo lo que hace es retornar la instancia de un objeto. Así que vamos a ponerlo a prueba.

const a = require('./myClass.js'),
      b = require('./myClass.js');

console.log(a === b);

El resultado va a ser true ahora.

¿Por qué?

Como mencioné, el módulo pasa a ser parte del proceso del cache de la aplicación pasando a resolver la misma instancia.

Tengo cuidado

Que el cache se asocia al nombre del fichero, así que podríamos por error dicho comportamiento.

const a = require('./myclass.js'),
      b = require('./MYCLASS.js');

console.log(a === b);

Esto sería false porque el fichero fue llamado primero en minúscula y luego en mayúscula.