Introducción a Node.js para principiantes

El objeto global

Cuando llamamos una instrucción como console.log():

app.js

console.log("Hola mundo")

Estamos haciendo referencia a un objeto llamado console y a su método log(). Lo interesante es que este objeto es accesible desde cualquier lugar, es lo que se conoce como un objeto global porque forma parte del ámbito global de un programa en Node.

Hay muchos objetos y funciones que forman parte del ámbito global, como por ejemplo las funciones para controlar temporizadores:

setTimeout()
clearTimeout()

setInterval()
clearInterval()

Un par muy interesante son también __filename y __dirname que almacenan el nombre del fichero y su localización:

console.log(__filename);
console.log(__dirname);

Pero la verdad es que estos dos objetos no son exactamente globales sino que se mapean en los ficheros al ejecutarse, como si fueran una configuración extra.

Sea como sea cuando utilizamos JavaScript en el navegador, estos objetos forman parte de la ventana, el objeto window, pero en Node no tenemos ventana, sino que como vimos tenemos un proceso:

console.log(process);

Este proceso almacena la información de la ejecución, pero en él no encontraremos las definiciones globales. Éstas se encuentran específicamente en otro objeto, el objeto global, cuyo contenido se añade al script al ejecutarse:

global.console.log("Hola mundo")
global.setTimeout()

Usando esta lógica podríamos hacer un programa estructurando el código en diferentes ficheros y enviar datos entre ellos añadiéndolos al objeto global:

datos.js

global.test = "Hola mundo";

Para cargar el fichero datos.js en nuestra app.js, utilizaríamos la función require que también forma parte del ámbito global:

app.js

require('./datos');

console.log(global.test);

Esto implica varias cosas, pero la más importante es que los datos globales se pueden volver a modificar, no están protegidos o mejor dicho, encapsulados:

app.js

require('./datos');

global.test = "Adiós mundo";
console.log(global.test);

La verdad es que usar variables globales es una mala práctica, no sólo en Node sino en todos los lenguajes. Hacen el código más difícil de entender, depurar, testear, mantener y reutilizar. Os dejaré un hilo en Stack Overflow donde podéis profundizar al respecto.

Así que todo esto nos lleva a la cuestión obvia, si no debemos utilizar global para comunicar las definiciones entre ficheros, ¿cómo lo hacemos? Pues con los módulos.