Bienvenidos sean a este post, hoy veremos un ttema muy particular.
Los modulos de este tipo se empezaron a utilizar como experimental a partir de la version 8.5 y con el tiempo quedaron implementadas de forma oficial, pero con las opciones correctas podemos implementarlas en versiones viejas.
Si conocen un poco sobre el tema o vienen de mis posts anteriores una herramienta muy util para podder realizarlo lo comentado en el titulo es a traves de babel, la cual adapta un codigo ECMAscript a CommonJS con los plug-in correctos, para lo cual les recomiendo este post, pero en este caso vamos a ver otra alternativa para entender mejor este concepto y para ello vamos a aplicarlo medante un ejemplo y para ello tambien necesitaremos de otra herramienta como es nvm, en caso de no tenerlo visiten este post donde explico como instalarlo, y como ejemplo reutilizaremos un codigo que ya vimos en este post, nuestro siguiente paso sera crear en un directorio un nuevo archivo con el nombre de modulo.mjs y le agregaremos el siguiente codigo:
modulo.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 };
Resumiendolo es simplemente una coleccion de funciones y variables que usaremos para exportar a nuestro programa, observen que son cosas simples como una funcion que incrementa una variable, una funcion para saludar y las variables en si para finalmente exportar todo el contenido, nuestro siguiente paso sera crear un nuevo archivo con el nombre de ej.mjs y le agregaremos el siguiente codigo:
ej.mjs
import * as modulo from './modulo.mjs';
console.log(modulo.saludar());
for (var i=0; i < 3; i++)
{
modulo.proximo();
console.log(modulo.default() + "\t" + modulo.cuadrado());
}
Aqui lo primero que haremos sera importar todo el contenido del archivo anterior y su primera accion sera invocar a la funcion saludar y luego mediante un bucle incrementaremos el valor interno de contar mediante proximo, y a su vez lo mostraremos y mostraremos su valor al cuadrado, todavia no lo vamos a ejecutar porque nuestro siguiente paso sera crear el entorno de experimentacion, para ello ejecutaremos el siguiente comando:
$ nvm install 6
Este nos instalara la version 6 de node.js y nuestro siguiente paso sera establecerla como predeterminada:
$ nvm use 6
Con esto ya tenemos nuestro entorno experimental preparado, si lo ejecutan veran la siguiente salida:
$ node ej.mjs
/home/tinchicus/lenguajes/node.js/3/ej.mjs:1
(function (exports, require, module, __filename, __dirname) { import * as modulo from './modulo.mjs';
^^^^^^
SyntaxError: Unexpected token import
at createScript (vm.js:56:10)
at Object.runInThisContext (vm.js:97:10)
at Module._compile (module.js:549:28)
at Object.Module._extensions..js (module.js:586:10)
at Module.load (module.js:494:32)
at tryModuleLoad (module.js:453:12)
at Function.Module._load (module.js:445:3)
at Module.runMain (module.js:611:10)
at run (bootstrap_node.js:394:7)
at startup (bootstrap_node.js:160:9)
$
Como pueden ver fallo, ahora ejecutaremos el siguiente comando:
$ npm install esm
Este sera el encargado de realizar la magia, porque sera la libreria que nos permitira usar los modulos ES en nuestras versiones viejas de node.js, pasemos a ejecutarlo con este modulo para ver su salida:
$ node --require esm ej.mjs
Hola, como estas?
1 1
2 4
3 9
$
Oops, funciono! en este caso gracias a la libreria y si se preguntan por la opcion que pasamos es similar a lo que hacemos a la hora de importarlas en codigo, es decir que es lo mismo que hubieramos hecho:
require('esm')
Pero mediante la linea de comandos, ahora vamos a crear un nuevo archivo con el nombre de ls.mjs y le agregaremos el siguiente codigo:
ls.mjs
const fs = require("fs").promises;
(async () => {
var dir=".";
if (process.argv[2]) dir = process.argv[2];
const archivos = await fs.readdir(dir);
for (let a of archivos)
{
console.log(a);
}
})().catch(err => { console.log(err); });
Este es el codigo que vimos a la hora de ver funciones asincronicas en este post, basicamente nos devuelve el contenido de un directorio informado y sino le pasamos alguno toma el actual, probemos de ejecutarlo con la opcion de esm y veamos como es su salida:
$ node --require esm ls.mjs
file:///home/tinchicus/lenguajes/node.js/3/ls.mjs:3
(async () => {
^
SyntaxError: Unexpected token (
$
En este caso nos devolvio el error ‘Unexpected token’ porque en esta version no tiene soporte completo en todo lo referido a async, por lo tanto para este caso en particular si seria mejor usar a babel para una mejor implementacion en versiones viejas de node.js y navegadores viejos pero es bueno saber que para intervenciones mas simples tenemos esta opcion disponible.
En resumen, hoy hemos visto una opcion alternativa para poder implementar modulos ECMAscript en versiones viejas de node.js, asi como tambien hemos visto como no es 100% perfecta y puede fallar pero puede ser una opcion viable para implementaciones simples, 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.


Donación
Es para mantenimento del sitio, gracias!
$1.50
