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);
}