El fichero package.json es un componente esencial dentro del funcionamiento de NPM. Este archivo desempeña un papel fundamental ya que almacena los datos del proyecto proyecto, sus dependencias, scripts personalizados y metadatos importantes.
Entre las funciones que tiene este fichero está:
Gestión de dependencias: El uso de package.json permite gestionar las dependencias del proyecto
Reproductibilidad: La combinación del fichero package.json junto con el fichero package-lock.json asegura que si puedes reproducir un proyecto (por ejemplo para duplicar, copiar a otra máquina)
Colaboración y distribución: Para compartir un paquete con otros desarrolladores, simplemente proporcionar el fichero package.json y los comandos para instalar las dependencias será suficiente
Estructura básica de package.json
La estructura del fichero package.json
es un formato JSON (JavaScript Object Notation). Por lo que es muy fácil de entender por una persona, e incluso editarlo a mano sin demasiada dificultad.
El fichero package.json
consta de varias claves y valores que definen las características y dependencias del proyecto. Veamos un ejemplo sencillo de un posible (inventado) archivo package.json
:
{
"name": "curso-npm",
"version": "1.0.0",
"description": "Curso de NPM - Aprende a utilizar Node Package Manager",
"main": "index.js",
"author": "LuisLlamas.es",
"license": "MIT",
"scripts": {
"start": "node index.js",
"test": "echo \"No hay pruebas disponibles\""
},
"dependencies": {
"express": "^4.17.1",
"lodash": "^4.17.21"
},
"devDependencies": {
"nodemon": "^2.0.12",
"eslint": "^7.32.0"
}
}
Explicación de las principales partes del archivo:
Atributo | Descripción | Ejemplo |
---|---|---|
name | Nombre del proyecto. | “curso-npm” |
version | Versión del proyecto. | “1.0.0” |
description | Descripción breve del proyecto. | |
main | Archivo principal del proyecto, es el punto de entrada cuando se importa el módulo. | “index.js” |
author | Nombre del autor del proyecto. | |
license | Licencia del proyecto. | “MIT” |
scripts | Define comandos que se pueden ejecutar usando npm run script-name . | |
dependencies | Lista de dependencias requeridas para que el proyecto funcione correctamente en producción. | “express”, “lodash” |
devDependencies | Lista de dependencias requeridas solo para desarrollo. | “nodemon”, “eslint” |
Scripts
La clave scripts permite definir comandos de terminal que podemos asociar a un Alias personalizado, para que sea más cómodo de usar por nosotros o por nuestros colaboradores.
Estos Scripts se pueden ejecutar mediante el comando
npm run nombre_script
En el ejemplo anterior teníamos dos scripts con Alias start
y test
. En ese caso
start
ejecutaría el archivo “index.js” con Node.jstest
muestra un mensaje que indica que no hay pruebas disponibles.
Estos scripts pueden utilizarse para realizar tareas como automatización de procesos, compilación, ejecución de pruebas, limpieza de directorios (entre otros muchos ejemplos).
Dependencies y DevDependencies
Las claves dependencies y devDependencies enumeran las dependencias del proyecto. La diferencia entre una y otra es que
- dependencies son necesarias para que el programa funcione correctamente en producción
- devDependencies son solo requeridas durante el desarrollo.
Separar estas dependencias es importante para permitir usar herramientas solo en la fase de desarrollo, pero evitando que se incluyan paquetes innecesarios en la distribución de la aplicación final (la de “verdad”).
Por ejemplo, imagina que estás usando una librería que te ayuda durante el desarrollo remarcándote errores de sintaxis. No quieres que esa librería forma parte del producto final. En ese caso, la añadirías en devDependencies.
Package-lock
El fichero package-lock.json
es un fichero que se genera automáticamente por NPM* en operaciones donde modifica el árbol de node_modules
o el archivo package.json
.
Su función principal es describir el árbol de dependencias exacto que se generó durante una instalación, permitiendo que futuras instalaciones generen árboles idénticos, independientemente de las actualizaciones intermedias de las dependencias.
No debemos tocar a mano el fichero Package-lock, es un fichero interno usado por NPM. Simplemente acostúmbrate a ignorarlo 😉