Módulos y NPM en NodeJS

  • Por
  • y  
Qué son los módulos en NodeJS, el gestor de paquetes NPM que permite administrar los módulos y dependencias que necesitamos en un proyecto local.
 
En el Manual de NodeJS estamos partiendo como base de las charlas #nodeIO ofrecidas por Alejandro Morales para DesarrolloWeb.com. En este caso todavía nos encontramos viendo contenido de nuestra primera charla, en la que nuestro ponente nos informa de una de las partes fundamentales en nuestros procesos de desarrollo en NodeJS, como son los módulos. Además, vimos el gestor de paquetes que viene en el framework.

En NodeJS el código se organiza por medio de módulos. Son como los paquetes o librerías de otros lenguajes como Java. Por su parte, NPM es el nombre del gestor de paquetes (package manager) que usamos en Node JS.

Si conoces los gestores de paquetes de Linux podrás hacerte una buena idea de lo que es npm, si no, pues simplemente entiéndelo como una forma de administrar módulos que deseas tener instalados, distribuir los paquetes y agregar dependencias a tus programas.

Nota: Por ejemplo, si estás acostumbrado a Ubuntu, el gestor de paquetes que se utiliza es el "apt-get". Por su parte, Fedora o Red Hat usan Yum.

El gestor de paquetes npm, no obstante, es un poquito distinto a otros gestores de paquetes que podemos conocer, porque los instala localmente en los proyectos. Es decir, al descargarse un módulo, se agrega a un proyecto local, que es el que lo tendrá disponible para incluir.

Incluir módulos con "require"

Javascript nativo no da soporte a los módulos. Esto es algo que se ha agregado en NodeJS y se realiza con la sentencia require(), que está inspirada en la variante propuesta por CommonJS.

La instrucción require() recibe como parámetro el nombre del paquete que queremos incluir e inicia una búsqueda en el sistema de archivos, en la carpeta "node_modules" y sus hijos, que contienen todos los módulos que podrían ser requeridos.

Por ejemplo, si deseamos traernos la librería para hacer un servidor web, que escuche solicitudes http, haríamos lo siguiente:

var http = require("http");

Existen distintos módulos que están disponibles de manera predeterminada en cualquier proyecto NodeJS y que por tanto no necesitamos traernos previamente a local mediante el gestor de paquetes npm. Esos toman el nombre de "Módulos nativos" y ejemplos de ellos tenemos el propio "http", "fs" para el acceso al sistema de archivos, "net" que es un módulo para conexiones de red todavía de más bajo nivel que "http" (de hecho "http" está mayormente escrito sobre el módulo "net" github.com/joyent/node/blob/master/lib/http.js), "URL" que permite realizar operaciones sobre "url", el módulo "util" que es un conjunto de utilidades, "child_process" que te da herramientas para ejecutar sobre el sistema, "domain" que te permite manejar errores, etc.

Podemos crear fácilmente nuestros módulos exportando las funciones que deseemos

Por supuesto, nosotros también podemos escribir nuestros propios módulos y para ello usamos module.exports. Escribimos el código de nuestro módulo, con todas las funciones locales que queramos, luego hacemos un module.exports = {} y entre las llaves colocamos todo aquello que queramos exportar.

function suma(a,b){
   return a + b;
}

function multiplicar(a,b){
   return a * b;
}

module.exports = {
   suma: suma,
   multiplicar: multiplicar
}

Asumiendo que el archivo anterior se llame “operaciones.js”, nosotros podriamos requerirlo más tarde e otro archivo.js de la siguiente manera:

var operaciones = require('./operaciones');
operaciones.suma(2,3);

Obviamente, esto es solo una toma de contacto y volveremos sobre este asunto más adelante.

Comando npm para gestión de paquetes

Por lo que respecta al uso de npm, es un comando que funciona desde la línea de comandos de NodeJS. Por tanto lo tenemos que invocar con npm seguido de la operación que queramos realizar.

npm install async

Esto instalará el paquete async dentro de mi proyecto. Lo instalará dentro de la carpeta "node_modules" y a partir de ese momento estará disponible en mi proyecto y podré incluirlo por medio de "require":

require("async");

Nota: Cabe fijarse en que no hace falta darle la ruta al paquete "async" porque npm me lo ha instalado dentro de node_modules y todo lo que está en esa carpeta se encuentra disponible para require() sin necesidad de decirle la ruta exacta para llegar.

Otras instrucciones posibles de npm son la de publicar paquetes (con "publish"), instalar globalmente (poniendo el flag -g al hacer el "install"), desinstalar, incluso premiar (puntuar paquetes hechos por otras personas), etc.

Podemos ver paquetes a instalar entrando en la página del gestor de paquetes npm: npmjs.org

Por último, sobre npm se mencionó que cada paquete tiene entre su código un archivo package.json que contiene en notación JSON los datos del paquete en sí. Es como una tarjeta de identificación del paquete, que puede servir para informarte a ti mismo y a cualquier sistema informático de sus características. Si tú fueras el creador de un paquete, o crearas alguna aplicación con NodeJS, también deberías incluir "package.json" con los datos del módulo o aplicación que se está creando, como son el autor, versión, dependencias, etc.

En el siguiente artículo vamos a ver algo más específico, que también nos sirva como primer ejemplo para realizar en NodeJS. En concreto veremos el módulo HTTP, con el que podremos hacer un rudimentario servidor web.

Autor

Miguel Angel Álvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Autor

Alejandro Morales Gámez

Alejandro Morales es un desarrollador web, especialista en JavaScript, Node.js, lua y Ruby. Gran aficionado de los proyectos de código abierto (Open Source), con más de 50 contribuciones a diferentes proyectos, entre los cuales esta: Nodester y npmjs.org... Autor de más de 6 módulos para node.js. Escritor ocasional. Gran observador de la conducta humana y uno de los fundadores de numbus.co.
Desarrollador web, especialista en JavaScript, Node.js, lua y Ruby.

Compartir