5 Proyecto Node Js¶
Introducción¶
Hasta ahora hemos estado creando ficheros sueltos de Javascript y hemos visto como usar unos en otros, pero la realidad es que ninguno de los ficheros que hemos creado han tenido una consistencia y una relación entre sí, es decir, no pertenecían a un mismo proyecto.
Un proyecto es un entorno de trabajo que contiene los diferentes ficheros con los que trabajar, pero además, en caso de Node JS, contiene archivo de configuraciones previas que nos facilitarán la vida a la hora de trabajar con Node JS.
Para poder crear proyectos Node JS será necesario el uso de npm.
NPM (Node Project Manager)¶
NPM es un manejador de paquetes para Node que nos permitirá instalar paquetes externos a nuestros proyectos, entre otras cosas.
NPM tiene dos definiciones principales:
- Un repositorio online para publicar paquetes de software libre para ser usado en proyectos Node JS.
- Una herramienta para terminal para interactuar con dicho repositorio que te ayuda a la instalación de utilidades, manejo de dependencias y publicación de paquetes.
Es decir, en tu proyecto basado en Node utilizarás la utilidad de linea de comandos (cli) para consumir paquetes desde el repositorio online, un listado gigantesco de soluciones de software para distintos problemas disponibles públicamente en npmjs.com y para manejar dependencias, y para ello necesitas un archivo de configuración que le diga a npm que este es un proyecto node.
package.json¶
Este archivo indica a npm que el directorio en el que se encuentra es un proyecto o paquete npm. Además, contiene la información del paquete incluyendo la descripción del mismo, versión, autor, dependencias, etc.
Este archivo es generado automáticamente mediante la ejecución del comando npm init
, que sirve para inicializar un proyecto. Al ejecutar dicho comando se te hará algunas preguntas para crear el paquete y completar la información del package.json.
La información a solicitar es:
- name: nombre del paquete que se va a desarrollar.
- version: corresponde a la versión del proyecto. Se recomienda mantener actualizado este campo cuando modificas algo en tu proyecto o librería utilizando semver.
- description: una breve descripción del proyecto.
- entry point: es el punto de entrada de tu proyecto, es decir, que archivo se ejecutará cuando se importe tu proyecto dentro de otro.
- test command: se define el comando que quieres ejecutar para realizar las pruebas de tu proyecto. Este comando será ejecutado cuando escribas
npm run test
. - git repository: define la url del repositorio git donde se alojará el proyecto. De esta forma se informa a los usuarios donde encontrar el código fuente del proyecto.
- author: creador del proyecto. Se puede indicar el nombre, el alias o el email.
- license: corresponde a la licencia que tiene el proyecto a crear. Así, se permite a las personas saber que y que no está permitido al usar tu código. Hecha un vistazo a las licencias soportadas. Normalmente, se suelee indicar la licencia MIT.
- private: valor booleano, que permitirá evitar que el paquete sea publicado en el repositorio. Será true, si deseas que el proyecto sea privado.
- keywords: son las palabras claves para que aparezca el repositorio cuando sea buscado por el usuario.
Al completar dicha información creará un fichero package.json con toda la información almacenada, por ejemplo:
{
"name": "my-first-node-package",
"version": "1.0.0",
"description": "My first project use node js",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"async",
"example"
],
"author": "irudev",
"license": "ISC"
}
Si se quiere obtener todos los valores por defecto se puede ejecutar el comando npm init --yes
o npm init -y
npm scripts¶
Como puedes observar en el package.json del ejemplo anterior, contiene todos los campos nombrados, pero además tiene un campo extra llamado scripts. Esta sección define un listado de propiedades que permiten ejecutar comandos dentro del contexto de tu proyecto incluyendo: comandos de otros paquetes listados como dependencias, scripts personalizados, scripts bash, etc.
De momento, solo hay un script el especificado por nosotros cuando hemos ejecutado npm init
y nos han preguntado por los tests. En caso de no indicar ninguno, se ejecutará echo \"Error: no test specified\" && exit 1
por defecto,
Podemos personalizar los script como creamos. Por ejemplo, podemos crear un script que al ejecutarlo, ejecute el index.js:
Dependencias de producción y dependencias de desarrollo¶
Para poder instalar dependencias se usa el comando npm install LIBRARY
donde ^LIBRARY* es la dependencia a instalar. Tambien se puede usar la versión reduciar npm i LIBRARY
:
El ejemplo anterior instalará en nuestro proyecto la librerías picocolors, que nos permitirá usar colores en nuestra consola de comandos al usar console
Al instalar un dependencia hay que tener en cuenta dos cosas:
- Se creará una carpeta node_modules, si es el primer módulo instalado, el cuál contiene todas las dependencias instaladas.
-
Aparecerá una nueva sección dependencies, si también es la primera instalada, que contendrá
NOMBRE:VERSION
. Donde NOMBRE es el nombre del paquete instalado y VERSION es la version del paquete con el formato semverTambién es posible encontrar algunos símbolos frente a la numeración de la versión, estos son:
-
^
: last minor release. Por ejemplo^1.0.0
, indica que 1.0.0 es la versión más baja que se puede instalar pero permite que se instale cualquier versión superar a esa pero se encuentre dentro de la versión 1. ~
: last patch release. Esta es la forma contraria de^
. Esta especificación~1.0.0
puede instalar la versión1.0.0
si es la última versión del patch.
Al usar el comando npm i PACKAGE
se instalará las dependencias pero en modo producción, es decir, cuando se despliegue la aplicación para ser subida a host, o a un servidor, serán instaladas.
Existen otro forma de instalar dependencias, npm install PACKAGE -D
, de esta forma se instalará en modo desarrollo, es decir, en el momento del despliegue no serán necesaria su instalación pero durante el desarrollo de la aplicación si que son necesarias.
Al instalar una dependencia en modo desarrollo, se añadirá otra sección devDependencies al package.json:
En el ejemplo anterior hemos instalado el package standard que corresponde a JavaScript Standard Style en modo dependencia. Este paquete permite seguir unas reglas de formato para los archivos Javascript. Para saber más visite: https://standardjs.com/readme-esla.html
package-lock.json¶
Este archivo es auto generado por npm install
y es una lista descriptiva y exacta de las versiones instaladas durante tu proceso. No esta destinado a ser leído ni manipulado por los desarrolladores, si no, para ser un insumo del proceso de manejo de dependencias.
Otros argumentos para npm install¶
Puedes usar algunos parámetros tales como
-g
: para indicar que quieres que el paquete se instale globalmente, y se mantenga en tu ordenador y no únicamente en tu proyecto. Esta opción no es muy recomendada.--production
: indica que la ejecución denpm install
solo instalará las dependencias listadas en el apartado dependencies dejando de lado las dependencias de desarrollo.
Otros scripts de npm¶
npm audit¶
npm tiene una cantidad de paquetes disponibles lo que es una gran característica indicando lo saludable del ecosistema que es capaz de generar nuevas librerías a gran velocidad, pero también puede ser un problema. npm puede albergar paquetes maliciosos o con problema de seguridad.
La organización detrás de npm mantiene una lista de agujeros de seguridad y puedes utilizar este comando para revisar tus dependencias.
npm audit
te entregará información de las vulnerabilidades encontradas en tus dependencias junto con una breve descripción de como resolverlo indicando la versión que corrige el defecto.
npm publish¶
En el caso de que tu proyecto sea una librería de software libre que quieres compartir con otros, este comando será el que te permitirá publicar tu paquete en el repositorio, solo necesitas ejecutar:
npm login
para ingresar a tu cuenta de npm.npm publish
para subir tu paquete al repositorio.
Ten en cuenta que necesitas tener bien configurados tu entry point y el script de build.
También puedes hacer uso de los scripts del ciclo de vida. Una serie de scripts que se ejecutan en diferentes momentos del proceso de publicación:
- prepare (desde
npm@4.0.0
): Se ejecuta antes de que el paquete se empaquete (packed) y antes de que se publique. También se ejecuta al corrernpm install
y después del scriptprepublishOnly
- prepublishOnly: Se ejecuta antes de que el paquete sea preparado y empaquetado y solo cuando se ejecuta
npm publish
- prepack: Se ejecuta antes de empaquetar, es decir antes de
npm pack
ynpm publish
- postpack: Se ejecuta después de que el paquete fuese generado y ubicado en su destino final.