Anuncios

Bienvenidos sean a este post, hoy seguiremos con el tema de los modulos.

Anuncios

Si vienen de posts anteriores ya hemos contemplado varios tipos de modulos para nuestros scripts, desde los mas simples como CommonJS pasando por los ECMAscript hasta los de tipo JSON y viendo algunas particularidades mas en el camino pero hoy nos centraremos en hablar un poco mas detallado de como son y como se identifican.

Anuncios

Si vamos a la documentacion de node.js todos los modulos que vimos anteriormente contenidos en un archivo se los denomina como archivos de modulos, veamos las extensiones que tenemos para nuestros archivos:

  • .js
  • .mjs
  • .cjs
  • .json
  • .node
Anuncios
Anuncios

Este ultimo usualmente esta compilado en C o C++ e inclusive con Rust, en cambio los primeros esta escritos en Javascript o json, tal como vimos hasta ahora, en los casos que importabamos los modulos, ya sea mediante import o require le anteponiamos el identificador «./» al nombre del archivo para indicarle desde donde debia buscarlo, en este caso es para indicarle que esta en el mismo directorio, si el modulo esta en el directorio anterior debemos anteponer el «../», pero tambien podemos usar el path completo o absoluto para poder indicar donde esta nuestro modulo, para el caso de CommonJS es de la siguiente forma:

/path/completo/al/archivo/archivo.js

Anuncios

Donde pasaremos todos los directorios desde el inicial hasta el nombre del archivo, en cambio para ES6 debemos hacerlo de la siguiente forma:

file:///path/completo/al/archivo/archivo.mjs
Anuncios
Anuncios

En este caso el path debemos pasarlo como un URL porque el estandar lo trabaja de esta forma, aunque es menester aclarar que no es habitual informar el path completo pero es bueno saber que se puede trabajar tambien de esta forma, tambien hay una diferencia entre los dos estandar y esta es la capacidad de manejar los archivos a la hora de la ejecucion, vamos a crear un pequeño ejemplo, para ello primero crearemos un archivo con el nombre de ej.js y le agregaremos el siguiente codigo:

ej.js

for(var i=1; i < 11; i++)
{
        console.log(i + "\t" + Math.pow(i,2));
}
Anuncios

En este mostraremos el resultado de cada pasada en el bucle y al lado su valor elevado al cuadrado, con este codigo en CommonJS podemos ejecutarlo de la siguiente manera:

$ node ej
1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64
9 81
10 100
$
Anuncios

Como pueden observar para el caso de CommonJS no es necesario informar la extension permitiendo que se ejecute perfectamente e inclusive podemos pasar el path donde se encuentra en caso de ser necesario, ahora veamos el caso de ES6, para ello primero debemos crear 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; }

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

En este caso tendremos una variable que quedara privada, una funcion que permitiremos el acceso e incrementara en cada llamado a la variable y una funcion tambien de tipo publica para mostrar un mensaje, nuestro siguiente paso sera crear otro archivo con el nombre de ej.mjs y le agregaremos el siguinte codigo:

ejesm.mjs

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

console.log(modulo.saludar());
console.log(modulo.proximo());
console.log(modulo.proximo());
Anuncios

En este caso simplemente importamos todo el contenido del modulo anterior y primero usamos la funcion saludar para luego llamar dos veces a proximo, vamos a probar de ejecutarlo de la siguiente manera:

$ node ejesm
Anuncios

Esto nos devolvera la siguiente salida:

$ node ejesm
node:internal/modules/cjs/loader:1031
throw err;
^

Error: Cannot find module '/home/tinchicus/lenguajes/node.js/4/ejesm'
at Function.Module._resolveFilename (node:internal/modules/cjs/loader:1028:15)
at Function.Module._load (node:internal/modules/cjs/loader:873:27)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:22:47 {
code: 'MODULE_NOT_FOUND',
requireStack: []
}
$
Anuncios

Pero si lo volvemos a ejecutar pero esta vez con la extension nos devolvera la siguiente salida::

$ node ejesm.mjs
Hola, como estas?
1
2
$
Anuncios

Es decir que ES6 necesita si o si el nombre del archivo completo, esto es debido a la forma que tiene de manejar los archivos, como vimos al principio, pero esta forma de trabajar tambien nos brinda una curiosidad.

Anuncios

Si bien node.js no permite en ES6 que se carguen otro tipo de protocolo solamente file://, esto es principalmente por un tema de seguridad, pero en las urls tenemos el caracter ? y el # que tienen conductas especiales en las mismas permitiendo usarlas de la siguiente forma:

import './modulo.mjs?query=1'
Anuncios

Si bien al momento de cargar el modulo este argumento sera ignorado de manera predeterminada pero esto no quita que existen algunos modulos experimentales que nos permitirian utilizarlo pero para entender esto debemos pasar al siguiente tema.

Anuncios

Modulos core de node.js

Los modulos core o de nucleo son aquellos que se encuentran pre-compilados en node.js y al ser parte del codigo fuente de node.js al momento de compilarse estos se convieren en archivos binario y dando como resultado que se encuentren siempre disponibles, sin saberlo hemos estado utilizando varios de ellos, veamos algunos de CommonJS:

const http = require('http');
const fs = require('fs').promises;
Anuncios

Y para ES6 lo hemos hecho de la siguiente manera:

import http from 'http';
import { promises as fs } from 'fs';
Anuncios

En cualquiera de los dos casos hemos estado importando el modulo http y fs para poder utilizarlo luego en nuestro codigo, antes de pasar al siguiente tema les dejo la documentacion con los modulos de node.js en la siguiente url:

https://nodejs.org/api/index.html

Anuncios

Usando un directorio como modulo

Habitualmente cuando trabajamos en un proyecto creamos un directorio donde contenemos todos los elementos, doccumentacion, plantillas y todo lo relacionado a este, y node.js nos permite crear un modulo con una estructura similar, por ejemplo si nosotros pasamos un directorio como modulo, en este debemos tener alguno de los siguientes archivos:

  • index.js
  • index.cjs
  • index.mjs
  • index.node
Anuncios
Anuncios

No se deben preocupar el archivo en si dado que el cargador se encarga de cargar el indice correcto, inclusive no es necesario que se informe el path completo porque este se obtiene en base al archivo que se cargo, su uso mas habitual es proporcionar el acceso a una API de una libreria dentro de este y en el directorio tengamos otros modulos pero que se encargan de la implementacion privada, asi que ahora tenemos dos formas de modulo y si bien son distintas las dos nos concederan acceso a funciones permitiendo ejecutar tareas en nuestros codigos.

Anuncios

En resumen, hoy hemos visto un poco mas sobre los archivos de modulo, las extensiones que podemos tener disponibles, las distintas formas de como tratar el path de un modulo dependiendo del estandar usado asi como tambien una diferencia entre uno y otro por el tema anterior, asi como un breve repaso sobre los modulos nucleos, una direccion url para ver la documentacion sobre los mismos y por ultimo como cargar un modulo que sea un directorio, espero les haya resultado util 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
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50