javascript - ¿Tiene sentido crear un IIFE en un módulo de Node.js?
Trabajando en JavaScript en un navegador siempre uso un IIFE para evitar la contaminación del espacio de nombres global.
(function() {})();
pero como Node.js usa common.js y casi todos los archivos son un módulo en sí mismos, ¿tiene sentido hacer IIFE (si se usa ES5) al comenzar un nuevo código?
Respuesta #1
No, no lo hace.
Internamente, Node ya envuelve el contenido del módulo con una función para crear un nuevo ámbito.
Puedes encontrar los detalles en este archivo; la función mediante la cual se envuelven los contenidos del módulo se define aquí, y en este método puedes ver que después de envolver el código del módulo, se ejecuta casi de inmediato (similar a lo que hace un IIFE).
Respuesta #2
Aunque respondido exactamente arriba, me gustaría agregar también algunos puntos importantes.
Dado que los módulos de Node.js están inherentemente envueltos en un IIFE por el sistema de módulos, nosotros como desarrolladores no necesitamos crear nuestros propios IIFEs. La encapsulación se proporciona de forma inherente para el aislamiento de alcance y permite que cada módulo tenga su propio contexto.
Prueba de que los Módulos de Node.js están Envuelta en un IIFE:
A) Podemos verificar rápidamente la estructura del envoltorio IIFE haciendo:
console.log(require('module').wrapper)
Lo cual básicamente nos da la estructura de la función envolvente IIFE en la consola.
B) Para verificar que cada módulo de Node.js esté realmente envuelto en una IIFE, puedes seguir estos pasos:
1. Comprendiendo el IIFE en los módulos de Node.js:
Cada módulo de Node.js está envuelto en un IIFE con el siguiente formato como se muestra en la imagen arriba.
(function (exports, require, module, __filename, __dirname) {
// Module code lives here
})
Este envoltorio asegura que cada módulo tenga acceso a las variables exports, require, module, __filename y __dirname sin contaminar el ámbito global.
2. Pasos para demostrar el envolvimiento IIFE:
a. Crea un nuevo archivo en tu proyecto de Node.js, por ejemplo, module.js.
b. Agrega el siguiente código a module.js:
console.log(arguments);
c. Ejecuta el módulo usando Node.js:
node module.js
3. Explicación:
Dado que cada función en JavaScript tiene acceso al objeto arguments, si el módulo de Node.js está envuelto dentro de un IIFE (que también es una función), entonces registrar arguments debería mostrar los argumentos predeterminados pasados al IIFE. Cuando ejecutes el código anterior, verás una salida como esta:
Esto confirma que el módulo está efectivamente envuelto en un IIFE, como se puede ver que el objeto arguments contiene las variables exports, require, module, __filename y __dirname.

