En este punto vamos a empezar con los módulos que son una parte muy importante y muy útil realmente.
Que son?
Bien los módulos básicamente son código JavaScript que utilizamos como si de una librería externa se tratase, es decir los importamos. Normalmente estos módulos se encuentran en una carpeta llamada node_modules en nuestro proyecto, que se crea automáticamente cuando instalamos algo con npm, por ejemplo. Pero claro no hemos visto nada de npm todavía ¿verdad?, pues simplemente poner en la línea de comandos (con la posición o ubicación en el path de vuestro proyecto) y poner
npm install async
Async es un módulo de npm que nos ayuda con la gestión de código asíncrono(como lo hace Node recordemos el event loop ;) ). De primeras al ejecutar el comando veréis algo similar a esto
De momento no hagáis mucho caso a lo que pone ya entraremos en eso más adelante, lo que quería mostraros es que si miráis vuestra carpeta de proyecto os ha creado una nueva carpeta llamada node_modules y si miráis lo que hay dentro podréis ver que os ha descargado dos carpetas y estas a su vez tienen un montón de ficheros y carpetas no?....pues esto son módulos, prácticamente cada fichero js esta configurado como un módulo.
Ahora que ya hemos visto un poco como es un módulo, hablemos un poco más en detalle de ellos.
Están basados en el estándar CommonJS y para usarlos tenemos que cargarlos en nuestros ficheros js, esto lo hacemos con la instrucción require.Esta instrucción es síncrona, es decir, no puede hacerse en un callback ni nada por el estilo.
Algo bueno que tienen los módulos es que son singletons, que para el que no sepa que es, es un patrón de diseño con el cual nos aseguramos que solo tenemos una instancia de un objeto, como puede ser una conexion a una base de datos. Lo que hace es que la primera vez que ejecutamos el require se ejecuta el código necesario para crear una instancia nueva de nuestro módulo, el resto de veces que llamemos a require para el mismo módulo nos devolverá la misma instancia que se habia creado previamente.
Pero, y como sabe lo que tiene que devolver al hacer el require?...Si miráis cualquier módulo veréis que al final tienen siempre algo parecido a esto
module.exports = nombreAlgunaFunciónUObjeto;
Eso es lo que realmente se importa, lo que está indicado en esa línea. Y para importar lo que haríamos sería
var nombre = require ('nombreAlgunaFunciónUObjeto');
Con lo que quedaría almacenado en esa variable lo que se había exportado. Lo que contenga el require depende un poco de donde se encuentre el fichero o el script del cual queremos importar y de donde esté nuestra aplicación de Node. Como tal tenemos varias opciones
- Que esté en la carpeta node_modules local, es decir, la que nos ha creado en nuestro proyecto cuando hemos usado npm install
- Puede encontrarse también en la carpeta node_modules global, ésta la crea npm al instalar node, y nosotros podemos almacenar módulos en ella usando npm install -g nombreMódulo
- Si lo que ponemos empieza por './', '../' o similar lo buscará en la ruta que indiquemos partiendo de la nuestra (la del fichero donde usamos el require)
- Si es un módulo del propio core de node con poner el nombre seria suficiente
Si tenemos que usar la ruta específica puede que tengamos que poner una ruta larguisima, esto se puede evitar de varias formas usando la variable de entorno NODE PATH o a partir de la versión 2.0 de npm podríamos ponerlo en el fichero packaje.json (ya hablaremos de él). Si tenéis curiosidad sobre como serían estas formas navegar por el ciber-espacio que ya hay mucha literatura sobre esto.
Antes de terminar este post hagamos un ejemplo creando nuestro propio módulo.
Vamos a usar la carpeta node_modules que ya tenemos, y lo que hacemos es crear dentro un fichero js nuevo con nombre heroName.js y ponemos este código
'use strict';
var heroName = function(name){
console.log("Nuestro héroe es ",name);
}
module.exports = heroName;
Y ahora fuera de la carpeta node_modules en nuestro proyecto creamos otro fichero js que yo lo he llamado modules.js y es tan simple como poner
'use strict';
var heroName = require('heroName');
heroName("Dr.Manhattan")
Y listo, como véis es algo bastante simple y funciona
Tambiés es posible exportar más de un método u objeto, para ello cambiemos un poco el código de nuestro módulo
'use strict';
var heroName = function(name){
console.log("Nuestro héroe es ",name);
}
var powerLevel = function(power){
console.log("Power level es:",power);
}
module.exports = {
heroName: heroName,
powerLevel: powerLevel
}
Y para usarlo, ahora nuestro require realmente devuelve un objeto con 2 métodos en él por lo que para usarlos
'use strict';
var hero = require('heroName');
console.log(hero);
hero.heroName("Dr.Manhattan");
hero.powerLevel("9000");
He añadido un log de nuesto objeto hero para que veáis lo que contiene
Si os fijáis ahora hero es un objeto con dos propiedades que realmente son dos funciones, las cuales podemos usar tranquilamente como si de cualquier otro método se tratara.
NPM
Son las siglas de Node Package Manager,y lo que nos permite es gestionar las dependencias de nuestra aplicación o proyecto, las instala, elimina o actualiza. Y también nos permite instalarlas de manera global para que podamos usarlas en cualquier proyecto.
NPM se apoya en un fichero llamado package.json que nos ayuda a mantener información de las dependencias de nuestro proyecto y las versiones que usamos.
Si comenzamos con un proyecto nuevo lo primero que deberiamos hacer es ejecutar
npm init
Esto lo que haría sería crearnos un fichero package.json preguntandonos ciertas cosas sobre nuestro proyecto para luego almacenarlas en ese fichero
Tenemps algunas cosas útiles como por ejemplo la parte de scripts que vemos en el fichero. Lo que pongamos en esos scripts actuará como alias de algún comando que queramos ejecutar, por ejemplo podemos poner:
"scripts": {
"test": "node test.js",
"start": "node callbacks.js"
},
Con esto solo tendríamos que poner npm seguido de nuestro nombre de script para ejecutarlo
npm start
Como vemos se ejecuta el fichero que ya creamos en algún post anterior. Puede que este caso no tenga mucha utilidad, pero si en lugar de ese comando tan simple tuvieramos que añadirle parámetros o queremos llamar a más elementos en la misma ejecución puede ser muy útil.
Para gestionar las dependencias de Node y que se guarden en nuestro package.json solo tenemos que ejecutar el comando de instalación de npm seguido de --save
npm install json --save
Ahora nuestro fichero package.json tendría esta pinta
Vemos que nos ha añadido la dependencia json con su número de versión.
También hemos comentado que podemos instalar dependencias de manera global en nuestro equipo, para ello con que ejecutemos
npm install -g jslint
Esto nos instalará en /usr/local/lib/node_modules/ la dependencia y creará un acceso directo o enlace simbólico en /usr/local/bin para que podamos ejecutarla desde cualquier sitio si es necesario.
Por último un detalle en cuanto las versiones de las dependencias, si os fijáis antes del número de versión pone un ^ y ¿por qué?....pues significa que npm puede actualizar esa dependencia siempre y cuando la versión no modifique el valor más a la izquierda que sea distinto de cero, es decir, si tenemos la versión
^9.0.6
El 9 no podría modificarlo, eso significa que la versión en este caso puede pasar de 9.0.7 a 9.X.X, pero si la versión que tenemos es
^0.2.5
Entonces la versión solo puede estar entre 0.2.5 a 0.2.X siendo X mayor que 5.
En el próximo post empezaremos ya con express y el trabaj o propio de node.
Un abrazooorrrr







