Qué es npm
npm (Node Package Manager) es un gestor de paquetes para Node.js. Es decir, se encarga de administrar la instalación, actualización y el manejo de dependencias o paquetes para tu módulo o proyecto de Node.js.
Con npm puedes instalar nuevos paquetes y distribuir también los que tu creas ya que mantiene una base de datos de los paquetes disponibles ya sea para uso público o de negocio.
Cuando instalas un nuevo paquete, este se instalará en tu equipo y esto puede hacerse de manera global, es decir, para que pueda usarse en cualquier proyecto, o puede ser local al proyecto.
Qué es un módulo de Node.js
Node.js es un entorno Javascript del lado del servidor, utiliza un modelo asíncrono y dirigido por eventos.
Todo el código en Node.js es principalmente organizado en módulos o paquetes.
En el sistema de módulos de Node.js, cada archivo es tratado como un módulo separado. Por ejemplo, considera un archivo llamado main.js:
1 2 |
const circulo = require('./circulo.js'); console.log(`El área de un círculo de radio 4 es ${circulo.area(4)}`); |
En la primera línea, main.js carga el módulo circulo.js que está en el mismo directorio que main.js.
Aquí están los contenidos de circulo.js:
1 2 3 4 5 |
const { PI } = Math; exports.area = (r) => PI * r ** 2; exports.circunferencia = (r) => 2 * PI * r; |
Bien, estos módulos pueden entonces, ser tan complejos como tu lo desees, y lo que puedes hacer con npm es publicarlos para que otras personas puedan usarlo, o incluso tu mismo en otros proyectos.
Requisitos para crear un paquete de npm
1. Datos en el package.json
npm utiliza un archivo para llevar el control de las dependencias además de los detalles del presente módulo. Este archivo es package.json y tiene varias propiedades, de las cuales, las requeridas para que un paquete pueda ser publicado son:
name
El nombre con el cual tu paquete será publicado en npm.
Los nombres de paquetes tienes ciertas reglas:
- El nombre debe ser menor o igual a 214 caracteres.
- El nombre no puede comenzar con un punto o un guión bajo.
- No deben tener letras mayúsculas.
- El nombre termina siendo parte de una URL, un argumento en la línea de comandos y un nombre de carpeta. Por lo tanto, el nombre no puede contener caracteres que no sean seguros para URL.
- Debe ser único, es decir, no pueden existir dos paquetes con el mismo nombre.
version
Tu paquete debe tener una versión siguiendo los estándares de SemVer, es decir, versionado semántico el cual utiliza tres valores:
- Cambio mayor: Se agrega un nuevo feature, se refactoriza completamente la aplicación, etc
- Cambio menor: Se hacen cambios menores.
- Parches: Sobre todo, se arreglan fallas.
main
Es el punto de entrada principal del programa. Es decir, si un paquete se llama foo, y un usuario lo instala, y luego lo requiere (“foo”), se devolverá el objeto de exportación de su módulo principal.
Este debe ser un ID de módulo relativo a la raíz de la carpeta del paquete.
Para la mayoría de los módulos, tiene más sentido tener solamente un script principal.
bin
Muchos paquetes tienen uno o más archivos ejecutables que les gustaría instalar en el PATH. Para esto, en el campo bin se pone un mapa del nombre del comando al nombre del archivo local. En la instalación, npm enlazará ese archivo con el prefijo / bin para instalaciones globales, o ./node_modules/.bin/ para instalaciones locales.
Ejemplo:
1 |
{ "bin" : { "myapp" : "./cli.js" } } |
De modo que cuando hagas las instalación de myapp generará un enlace de cli.js a /usr/local/bin/myapp
Esto dará acceso a que tu paquete se pueda ejecutar directamente usando el comando que hayas indicado, en ente caso sería myapp.
Puedes leer mas acerca de los valores que acepta el package.json en la documentación oficial de npm: https://docs.npmjs.com/files/package.json
2. Archivo principal
El archivo ejecutable agregado en el main y en el bin en el package.json debe ser un archivo que permita la ejecución de toda la lógica del paquete con Node.js.
Como una recomendación se propone que se utilice el shebang de Node.js
1 2 3 4 |
#!/usr/bin/env node // Aquí debe ir la lógica que ejecuta tu paquete myModule.run() |
y que se le asignen permisos de ejecución al archivo.
1 |
chmod +x index.js |
Esto no es obligatorio, pero otorga mas flexibilidad a la ejecución del paquete cuando no se hace con npm.
Puedes leer un poco mas acerca del shebang de Node.js en esta excelente explicación en stackoverflow: https://stackoverflow.com/a/33510581
3. Configurar npm en tu entorno de desarrollo
Crear cuenta en npm
Es necesario crear una cuenta en https://www.npmjs.com/
Agregar usuario de npm al cli
Asumiendo que ya se tiene instalado npm, el siguiente paso es iniciar sesión en la terminal. De este modo, cualquier nueva interacción relacionada con publicación de paquetes se realizará con el usuario que se tiene registrado.
Para revisar si ya se tiene algun usuario registrado se puede usar el comando
1 |
npm whoami |
Para iniciar sesión se usará el comando npm login y completar los datos solicitados de username y password
1 |
npm login |
Escribir el código del paquete de npm
Ya que se ha configurado el archivo package.json y se ha definido el archivo de punto de entrada, no queda mas que escribir toda la lógica del paquete, el cual puede estar separado en mas modulos que en conjunto generan un proyecto tan complejo como se desee.
Probar el paquete de npm sin publicarlo
Aún cuando has terminado de escribir todo tu paquete, inclusive si se han corrido pruebas, no existe la certeza de que esto vaya a funcionar correctamente una vez publicado.
npm otorga una manera de “instalar” un paquete como si este estuviese publicado haciendo en realidad un link a tus archivos locales.
Esto dará mucha flexibilidad ya que al instalarlo inclusive podrás probar los scripts de pre y post install.
Para lograr este “link”, lo que debes hacer es ejecutar el comando npm link dentro del folder de tu proyecto, en la raíz.
1 |
npm link |
Cada que hagas cambios a tu código deberás volver a ejecutar npm link, ya que este actualizará inclusive el package lock en caso de que hayan cambiado las dependencias.
Un buen Readme antes de publicar el paquete de npm
Si ya has hecho todas las pruebas y estas seguro que tu paquete funciona correctamente, antes de publicarlo se recomienda redactar un buen README, ya que este archivo dará toda la información necesaria para que otros desarrolladores tengan claro como usar tu paquete y que funcionalidades estan disponibles.
Desde mi perspectiva, el README debería incluir:
- Badges de la licencia, la versión, el test coverage y los estatus de los builds.
- Descripcion de al menos un párrafo de lo que hace el paquete
- Listado de características
- Pasos de como instalar el paquete
- Pasos de como usar el paquete
- En caso de que apliqué, detalles del API
Publicar un paquete de npm
Ahora que ya se tiene todo listo, solo falta publicar el paquete en la base de datos de npm.
Estando en la raíz del proyecto, hay que ejecutar
1 |
npm publish |
Listo, tienes ahora un paquete publicado!
¿Te gustó este artículo?
Si te gustó este artículo, te ha servido o aprendiste algo nuevo; compártelo en tus redes sociales o invítame un cafe.