Node.js

Node

Tutorial Node: Gestores npm, yarn y bun

Aprende las funciones y diferencias clave entre npm, yarn y bun para gestionar dependencias en proyectos Node.js de forma eficiente.

Aprende Node y certifícate

Qué es npm y para qué sirve

npm (Node Package Manager) es el gestor de paquetes oficial de Node.js y constituye uno de los ecosistemas de software más grandes del mundo. Se instala automáticamente junto con Node.js y actúa como una herramienta fundamental para gestionar las dependencias y bibliotecas que necesitan nuestros proyectos.

En esencia, npm funciona como un repositorio centralizado donde los desarrolladores publican paquetes de código reutilizable. Estos paquetes pueden ser desde pequeñas utilidades hasta frameworks completos, y están disponibles para que cualquier desarrollador los descargue e integre en sus proyectos.

Funciones principales de npm

npm desempeña varias funciones esenciales en el desarrollo con Node.js:

  • Instalación de paquetes: Permite descargar e instalar bibliotecas de terceros con un simple comando
  • Gestión de dependencias: Mantiene un registro de todas las bibliotecas que utiliza tu proyecto
  • Control de versiones: Gestiona qué versiones específicas de cada paquete necesita tu aplicación
  • Publicación de paquetes: Facilita compartir tu propio código con la comunidad
  • Ejecución de scripts: Permite definir y ejecutar comandos personalizados para tu proyecto

El archivo package.json

El corazón de cualquier proyecto Node.js es el archivo package.json, que npm utiliza para gestionar la información del proyecto. Este archivo contiene metadatos sobre tu aplicación, incluyendo nombre, versión, descripción y, lo más importante, la lista de dependencias.

{
  "name": "mi-proyecto",
  "version": "1.0.0",
  "description": "Un proyecto de ejemplo",
  "main": "index.js",
  "dependencies": {
    "lodash": "^4.17.21",
    "axios": "^1.6.0"
  },
  "devDependencies": {
    "nodemon": "^3.0.1"
  }
}

Tipos de dependencias

npm distingue entre diferentes tipos de dependencias según su propósito:

  • Dependencies: Paquetes necesarios para que la aplicación funcione en producción
  • DevDependencies: Herramientas de desarrollo que solo se necesitan durante el proceso de construcción
  • PeerDependencies: Dependencias que deben ser instaladas por el proyecto que consume tu paquete
  • OptionalDependencies: Paquetes que mejoran la funcionalidad pero no son críticos

Comandos básicos de npm

Los comandos más utilizados en npm incluyen:

  • npm init: Crea un nuevo archivo package.json de forma interactiva
  • npm install: Instala todas las dependencias listadas en package.json
  • npm install <paquete>: Instala un paquete específico
  • npm uninstall <paquete>: Elimina un paquete del proyecto
  • npm update: Actualiza los paquetes a sus versiones más recientes compatibles
  • npm run <script>: Ejecuta un script definido en package.json

El directorio node_modules

Cuando instalas paquetes, npm los almacena en una carpeta llamada node_modules. Esta carpeta contiene todo el código de las bibliotecas que tu proyecto necesita, organizadas de manera que Node.js pueda encontrarlas automáticamente cuando uses require() o import.

mi-proyecto/
├── node_modules/
│   ├── lodash/
│   ├── axios/
│   └── ...
├── package.json
├── package-lock.json
└── index.js

Versionado semántico

npm utiliza el versionado semántico (SemVer) para gestionar las versiones de los paquetes. Este sistema utiliza tres números separados por puntos (MAJOR.MINOR.PATCH):

  • MAJOR: Cambios incompatibles con versiones anteriores
  • MINOR: Nueva funcionalidad compatible con versiones anteriores
  • PATCH: Correcciones de errores compatibles

Los símbolos ^ y ~ en package.json indican qué actualizaciones automáticas acepta tu proyecto. El símbolo ^ permite actualizaciones menores y parches, mientras que ~ solo permite parches.

Registro público y privado

El registro público de npm aloja millones de paquetes gratuitos disponibles para toda la comunidad. Sin embargo, npm también permite configurar registros privados para empresas que necesitan mantener paquetes internos seguros.

La línea de comandos de npm se conecta por defecto al registro público, pero puede configurarse para usar registros alternativos según las necesidades del proyecto o la organización.

Diferencia entre npm y yarn y bun

Aunque npm es el gestor de paquetes oficial de Node.js, la comunidad ha desarrollado alternativas que buscan mejorar aspectos específicos como la velocidad, la seguridad o la experiencia de desarrollo. Las dos alternativas más destacadas son Yarn y Bun, cada una con características distintivas que las hacen atractivas para diferentes escenarios.

Yarn: El competidor establecido

Yarn fue desarrollado por Facebook (ahora Meta) en 2016 como respuesta a las limitaciones que npm tenía en ese momento. Aunque npm ha evolucionado significativamente, Yarn mantiene ventajas específicas que lo hacen relevante.

Características principales de Yarn:

  • Instalación determinista: Genera un archivo yarn.lock que garantiza que todos los desarrolladores del equipo instalen exactamente las mismas versiones
  • Instalación en paralelo: Descarga múltiples paquetes simultáneamente, reduciendo el tiempo total de instalación
  • Caché offline: Almacena paquetes localmente para permitir instalaciones sin conexión a internet
  • Workspaces nativos: Facilita la gestión de proyectos monorepo con múltiples paquetes relacionados

Instalación de Yarn:

npm install -g yarn

Comandos equivalentes entre npm y Yarn:

  • Inicializar proyecto: npm inityarn init
  • Instalar dependencias: npm installyarn install o simplemente yarn
  • Añadir paquete: npm install lodashyarn add lodash
  • Eliminar paquete: npm uninstall lodashyarn remove lodash
  • Ejecutar script: npm run devyarn dev

Bun: La nueva generación

Bun representa un enfoque revolucionario al ser mucho más que un simple gestor de paquetes. Es un runtime completo de JavaScript que incluye bundler, transpilador y gestor de paquetes, todo optimizado para máximo rendimiento.

Características distintivas de Bun:

  • Velocidad extrema: Escrito en Zig, es significativamente más rápido que npm y Yarn en operaciones de instalación
  • Runtime alternativo: Puede ejecutar código JavaScript/TypeScript sin necesidad de Node.js
  • Bundler integrado: Incluye herramientas de empaquetado sin dependencias adicionales
  • Compatibilidad con Node.js: Mantiene compatibilidad con la mayoría de APIs de Node.js
  • Soporte nativo de TypeScript: Ejecuta archivos TypeScript directamente sin transpilación previa

Instalación de Bun:

curl -fsSL https://bun.sh/install | bash

Comandos básicos de Bun:

# Inicializar proyecto
bun init

# Instalar dependencias
bun install

# Añadir paquete
bun add lodash

# Ejecutar archivo
bun run index.js

# Ejecutar script del package.json
bun run dev

Comparativa de rendimiento

La velocidad de instalación es uno de los factores más notables entre estos gestores:

  • npm: Velocidad base, ha mejorado considerablemente en versiones recientes
  • Yarn: Aproximadamente 2-3x más rápido que npm en la mayoría de escenarios
  • Bun: Puede ser hasta 10-20x más rápido que npm en instalaciones grandes

Compatibilidad y ecosistema

Compatibilidad con package.json:

Todos los gestores utilizan el mismo formato de package.json, lo que facilita la migración entre herramientas. Sin embargo, cada uno genera su propio archivo de bloqueo:

  • npm: package-lock.json
  • Yarn: yarn.lock
  • Bun: bun.lockb (formato binario)

Soporte del ecosistema:

  • npm: Soporte universal, funciona con todos los paquetes del registro
  • Yarn: Excelente compatibilidad, ampliamente adoptado en la industria
  • Bun: Buena compatibilidad con la mayoría de paquetes, aunque algunos paquetes específicos de Node.js pueden presentar problemas

Cuándo usar cada gestor

Elige npm cuando:

  • Trabajas en un equipo que prefiere herramientas oficiales
  • Necesitas máxima compatibilidad con documentación y tutoriales
  • El proyecto no requiere optimizaciones específicas de rendimiento

Elige Yarn cuando:

  • Trabajas en equipos grandes donde la consistencia de dependencias es crítica
  • Gestionas proyectos monorepo complejos
  • Necesitas instalaciones offline frecuentes

Elige Bun cuando:

  • La velocidad de desarrollo es prioritaria
  • Trabajas con proyectos que se benefician de un runtime más rápido
  • Quieres experimentar con tecnologías de vanguardia
  • Desarrollas aplicaciones que requieren máximo rendimiento

Migración entre gestores

Migrar de npm a Yarn:

# Eliminar node_modules y package-lock.json
rm -rf node_modules package-lock.json

# Instalar con Yarn
yarn install

Migrar de npm a Bun:

# Eliminar node_modules y package-lock.json
rm -rf node_modules package-lock.json

# Instalar con Bun
bun install

La elección del gestor depende principalmente de las necesidades específicas del proyecto, el equipo de desarrollo y las prioridades en términos de rendimiento, estabilidad y compatibilidad. Todos son herramientas válidas que pueden coexistir en diferentes proyectos según el contexto.

Aprende Node online

Otras lecciones de Node

Accede a todas las lecciones de Node y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Accede GRATIS a Node y certifícate

Ejercicios de programación de Node

Evalúa tus conocimientos de esta lección Gestores npm, yarn y bun con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.