Anuncios

Bienvenidos sean a este post, hoy veremos como son los modulos con el otro estandar.

Anuncios

Este nuevo estandar se implemento para normalizar tanto desde el lado del navegador como del lado del servidor, si bien son muy similares tienen algunas diferencias importantes pero una de las mas importantes caracteristicas fue como hacer para que node.js lo diferencie entre archivos? Muy facil, simplemente con la extension del archivo:

  • .js, para los archivos de CommonJS
  • .mjs, para los archivos de ES6
Anuncios
Anuncios

Si bien al dia de hoy node.js permite diferenciarlos de otra manera y no es necesario respetar el tema de las extensiones pero se sigue utilizando como una buena practica, para entenderlo un poco mejor vamos a tomar el ejemplo que vimos en este post y lo modificaremos para el estandar ES6, pero en lugar de modificar el archivo generado en el post antes mencionado crearemos uno nuevo en el mismo directorio pero con el nombre ejemplo01.mjs y una vez creado le agregaremos el siguiente codigo:

ejemplo01.mjs

let contar = 0;

export function proximo() { return ++contar; }

function cuadrado() { return Math.pow(contar, 2); }

export function saludar() {
	return "Hola, como estas?";
}

export default function() { return contar; }
export const valor = 42;
export let nocontar = -1;
export { cuadrado };
Anuncios
Anuncios

Si comparamos este codigo con el visto en este post notaremos varias similitudes, especialmente en la variable contar, la funcion proximo y la funcion saludar que hacen exactamente lo mismo que en el post antes citado y tal como anteriormente solamente podemos importar a proximo y saludar, pasemos a hablar sobre las nuevas funciones y variables.

Anuncios
Anuncios

La primera sera cuadrado y esta devolvera el valor al cuadrado de la variable contar, este no puede ser importado… por ahora, despues tenemos un export default de una funcion que podremos acceder directamente con el objeto que crearemos, de este tipo de exportacion podremos tener uno solo por modulo, en este caso en particular nos devolvera el valor de la variable contar, recuerden que esta es privada y no podra ser accedida por el objeto que usemos, despues permitiremos la exportacion de una constante llamada valor y una variable llamada nocontar con sus respectivos valores, por ultimo tenemos una curiosidad, recuerden que antes comentamos que cuadrado no podia ser importado, con esta linea podemos exportar la funcion cuadrado que definimos anteriormente, con esto podemos decir que todo lo que no antepongamos la palabra export sera considerada como privada y no podra ser accedida si definimos un objeto con este modulo, en cambio con el export lo haremos publico, por ultimo tenemos otra forma de definir una exportacion:

modules.export.funcion_nombre = function() { ... }
Anuncios

Por ejemplo tomemos la funcion saludar:

modules.export.saludar = function() { return "Hola, como estas?"; }
Anuncios

Con esto tenemos todo el modulo comentado, ahora vamos a generar un nuevo archivo al cual llamaremos ejecutar.mjs y le agregaremos el siguiente codigo:

ejecutar.mjs

import * as ejemplo01 from './ejemplo01.mjs';

console.log("Saludo: " + ejemplo01.saludar());
ejemplo01.proximo();
ejemplo01.proximo();
console.log("contar: " + ejemplo01.default());
console.log("cuadrado: " + ejemplo01.cuadrado());
console.log("valor: " + ejemplo01.valor);
Anuncios
Anuncios

Aqui veremos la primera diferencia con respecto al otro estandar, para importar los elementos de un modulo utilizaremos a import en lugar de require, con este metodo podemos decir cuales elementos queremos importar, para esta ocasion usamos el comodin asterisco (*) para que importe todos los elementos, luego le diremos como lo identificaremos por medio de as y finalmente le diremos de donde debe cargarlo, en este caso es igual a require, con todos los elementos importados vamos a continuar con el codigo, primero mostraremos la salida del metodo saludar, despues usaremos dos veces al metodo proximo, para despues mostrar el valor de contar que fue modifficado con las llamadas anteriores, por ultimo mostraremos la salida del metodo cuadrado y por ultimo el valor de la variabe valor, ejecutemos y veamos como es su salida:

$ node ejecutar.mjs 
Saludo: Hola, como estas?
contar: 2
cuadrado: 4
valor: 42
$
Anuncios

Vamos a ver un poco mas sobre import, para ello vamos a modificar el archivo ejecutar.mjs de la siguiente manera:

ejecutar.mjs

import { saludar, 
	proximo,
	cuadrado } 
	from './ejemplo01.mjs';

console.log("Saludo: " + saludar());
proximo();
proximo();
console.log("cuadrado: " + cuadrado());
Anuncios
Anuncios

En este codigo dejamos de importar todos los elementos y solamente importaremos tres metodos del modulo, a diferencia de como vimos en el codigo anterior en lugar de asociar todos los elementos a un alias aqui no lo haremos, esto hara que podamos llamar directamente a los metodos del modulo sin necesidad del alias, esto lo podemos ver en la siguiente parte del codigo, donde usamos el metodo saludar, ejecutamos dos veces proximo y por ultimo ejecutamos a cuadrado, veamos como es su salida:

$ node ejecutar.mjs 
Saludo: Hola, como estas?
cuadrado: 4
$
Anuncios

Ahora al final del codigo agreguemos la siguiente linea:

console.log("valor: " + valor);
Anuncios

Si lo ejecutamos nos devolvera la siguiente salida:

$ node ejecutar.mjs 
Saludo: Hola, como estas?
cuadrado: 4
file:///home/tinchicus/lenguajes/node.js/ejecutar.mjs:10
console.log("valor: " + valor);
^

ReferenceError: valor is not defined
at file:///home/tinchicus/lenguajes/node.js/ejecutar.mjs:10:25
at ModuleJob.run (node:internal/modules/esm/module_job:193:25)
at async Promise.all (index 0)
at async ESMLoader.import (node:internal/modules/esm/loader:527:24)
at async loadESM (node:internal/process/esm_loader:91:5)
at async handleMainPromise (node:internal/modules/run_main:65:12)

Node.js v18.9.0
$
Anuncios

Como pueden ver al no ser importado no pudo encontrar este metodo y por lo tanto nos devolvio el error que vemos, vamos a modificar el codigo anterior de la siguiente manera:

ejecutar.mjs

import { saludar as hola, 
	proximo,
	cuadrado,
	valor } 
	from './ejemplo01.mjs';

console.log("Saludo: " + hola());
proximo();
proximo();
console.log("cuadrado: " + cuadrado());
console.log("valor: " + valor);
Anuncios

En este caso asignamos un alias al metodo saludar por lo cual de ahora en adelante para poder utilizarlo debemos usar el nuevo alias y tambien importamos a valor para solucionar el error anterior, la otra modificacion es que llamamos a hola en lugar de saludar, si lo ejecutamos esta sera su salida:

$ node ejecutar.mjs 
Saludo: Hola, como estas?
cuadrado: 4
valor: 42
$
Anuncios

Como pueden observar este estandar nos ofrece una forma mas util de exportar e importar elementos de un modulo, pero eso siempre debera ajustarse a nuestras necesidades dado que en algunas ocasiones debemos ajustarnos a lo mas practico.

Anuncios

En resumen, hoy hemos visto como trabajar con modulos en el standar ES6/ES2015, como se preparan para la exportacion, como se importan en nuestros codigos, y varias opciones disponibles, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50