← Volver al blog

CommonJS | ECMAScript modules

En el ecosistema de javascript tenemos dos formas de importar y exportar módulos (acceder a otros archivos). En el frontend por una lado tenemos ECMAScript modules y en el backend con Nodejs tenemos CommonJS.

La forma en la que Nodejs maneja sus módulos desde el 2009 es CommonJS.

CommonJS a quedado anticuado debido a las nuevas características de javascript sin embargo aún sigue vigente y es bastante utilizado.

Recordemos como funciona CommonJS.

Supongamos que tenemos un archivo my_module.js y queremos exportar

<!-- my_module.js | exportando -->
function myExportFunction() {
  return 'Soy una función exportada';
}

Para exportar podemos crear una propiedad del objeto y asignar en este caso la función que tenemos de ejemplo.

module.exports.myExportFunction = myExportFunction;

o exportando un objeto directamente

module.exports = {
  myExportFunction,
};

En otro archivo (index.js) recibimos el módulo

<!-- index.js | importando -->
const myImport = require('./my_module.js')

Accedemos al objeto y ejecutamos la función

myImport.myExportFunction();

Si venís del frontend seguro estas familiarizado con la sintaxis de import y export asi que acá viene lo interesante, para aplicarlo en node, antes tenemos que agregar a nuestro package.json la siguiente linea.

"type": "module"

Continuando con nuestro ejemplo, solo debemos agregar la palabra reservada export.

<!-- my_module.js | exportando -->
export function myExportFunction() {
  return 'Soy una función exportada';
}

También podemos exportarla por defecto.

export default myExportFunction;

Recibimos el módulo y muy importante de no olvidarnos la extensión .js porque debemos respetar el estándar de lo contrario nos dará error. Finalmente usamos import y from., destructuramos, es decir extraemos la propiedad del objeto y ejecutamos.

<!-- index.js | importando -->
import { myExportFunction } from './module/my_module.js'

En el caso de la función por defecto podemos renombrarla, es opcional.

import myExportDefaultFunction from './module/my_module.js';

Podemos ver los resultados:

console.log(myExportFunction(), myExportDefaultFunction());

Fetch en Nodejs

Es posible utilizar la api de fetch, de momento es experimental y funciona con las útimas versiones.

fetch('https://jsonplaceholder.typicode.com/users')
  .then((res) => res.json)
  .then((data) => console.log(data));

async function loadData() {
  try {
    const res = await fetch('https://jsonplaceholder.typicode.com/posts');
    const data = await res.json();
    console.log(data);
  } catch (error) {
    console.log(error);
  }
}

loadData();

Algo interesante que sucede cuando agregamos en nuestro package.json

"type": "module"

es que podemos dejar de usar una función async para pedir los datos

try {
  const res = await fetch('https://jsonplaceholder.typicode.com/posts');
  const data = await res.json();
  console.log(data);
} catch (error) {
  console.log(error);
}
powered by