npm (Node Package Manager) es el gestor de paquetes estándar de la plataforma Node.js, incluido en la instalación de Node.js. npm gestiona las dependencias de proyectos JavaScript y TypeScript: instala librerías en node_modules, actualiza versiones de paquetes y resuelve conflictos de versiones. package.json es el archivo de configuración central con metadatos y lista de dependencias. npm Registry es el registro de paquetes más grande. Más información en npm Registry.
Puntos clave
npm fue creado en 2010 por Isaac Schlueter como una solución para gestionar dependencias de Node.js. Desde 2014, npm es gestionado por npm, Inc., adquirida por Microsoft/GitHub en 2020. La herramienta consta de dos partes: la CLI (línea de comandos) para instalar y gestionar paquetes, y el Registry, el repositorio central de todos los módulos publicados en registry.npmjs.org.
npm Registry es el registro de paquetes más grande: más de 2 millones de paquetes y más de 10 mil millones de descargas mensuales. Cada paquete tiene una versión SemVer, descripción, dependencias, licencia y autoría. La publicación de su propio paquete se realiza mediante npm publish. npm admite paquetes con ámbito para organizaciones (@scope/package), registros privados y auditoría de seguridad integrada.
Node.js versión 18+ incluye npm 9+ con rendimiento mejorado, workspaces para monorepositorios y un mecanismo de dependencias pares rediseñado. El ecosistema npm abarca JavaScript del lado del servidor, frontend (React, Vue, Angular), desarrollo móvil (React Native), herramientas de compilación (Webpack, Vite) y utilidades CLI. npm es el canal principal de distribución de librerías JavaScript.
npm install — el comando principal que lee package.json y package-lock.json para instalar todas las dependencias en node_modules. En la primera ejecución, npm calcula el grafo de dependencias, resuelve conflictos de versiones y genera package-lock.json. El comando npm install <package> instala un paquete específico; la bandera --save-dev lo añade a devDependencies, --global lo instala globalmente.
npx — un ejecutor de paquetes incluido en npm desde la versión 5.2. npx permite ejecutar utilidades CLI sin instalación global: npx react-native init o npx create-react-app my-app. npx descarga el paquete en una caché temporal, lo ejecuta y lo limpia al finalizar. npx también es útil para ejecutar versiones específicas de herramientas.
npm audit escanea el árbol de dependencias en busca de vulnerabilidades conocidas de la base de datos de npm. El comando genera un informe con niveles de criticidad (critical, high, moderate) y recomienda npm audit fix para actualizar automáticamente los paquetes vulnerables. npm cache almacena los paquetes descargados localmente. npm cache clean --force limpia la caché cuando hay problemas de instalación. npm outdated muestra los paquetes desactualizados.
# Comandos básicos de npm
$ npm install
$ npm install react-native-webview --save
$ npm install typescript --save-dev
# Ejecución sin instalación global
$ npx react-native init MyApp
# Auditoría de seguridad
$ npm audit --fix
package.json es un archivo JSON en la raíz del proyecto que describe sus metadatos, dependencias y configuración. Campos obligatorios: name (nombre único del paquete) y version (versión SemVer, por ejemplo 1.0.0). El archivo se crea con npm init -y para una inicialización rápida o manualmente.
Semantic Versioning (SemVer) es un estándar de versionado en formato MAJOR.MINOR.PATCH. La versión mayor cambia con cambios incompatibles de API, la menor al añadir funcionalidad (compatible hacia atrás), y el parche al corregir errores. El símbolo ^ antes de la versión permite actualizaciones menores y de parche, mientras que ~ solo permite actualizaciones de parche.
{
"name": "my-app",
"version": "1.0.0",
"private": true,
"scripts": {
"start": "expo start",
"android": "expo start --android",
"ios": "expo start --ios"
},
"dependencies": {
"react": "^18.3.0",
"react-native": "^0.76.0"
},
"devDependencies": {
"typescript": "^5.5.0",
"@types/react": "^18.3.0"
}
}
| Campo | Propósito | Valor de ejemplo |
|---|---|---|
| scripts | Comandos de ejecución para npm run | "start": "node index.js" |
| dependencies | Dependencias de producción de la aplicación | "react": "^18.3.0" |
| devDependencies | Herramientas de desarrollo y pruebas | "jest": "^29.7.0" |
| peerDependencies | Dependencias anfitrionas para librerías | "react": ">=17.0.0" |
| engines | Requisitos de versión de Node.js | {"node": ">=18.0.0"} |
Los proyectos de React Native utilizan activamente npm para la gestión de dependencias. El conjunto estándar incluye react, react-native, librerías de navegación (React Navigation), de peticiones HTTP (axios), de gestión de estado (Redux, Zustand) y componentes de UI. npm permite instalar miles de paquetes compatibles desde el registro.
npx pod-install — un comando obligatorio tras instalar módulos nativos en React Native para iOS. npm genera automáticamente un Podfile.lock basado en package-lock.json. En proyectos Expo se usa expo install en lugar de npm install, ya que selecciona versiones compatibles con la versión actual de Expo SDK.
Los conflictos de versiones son un problema común en React Native: react-native-reanimated, react-native-gesture-handler y react-native-safe-area-context requieren versiones alineadas. La solución es actualizar todos los paquetes a las últimas versiones compatibles o usar --legacy-peer-deps. package-lock.json es fundamental para los módulos nativos compilados mediante CocoaPods y Gradle.
npm es el gestor de paquetes estándar incluido con Node.js. Las principales alternativas: yarn (creado por Facebook en 2016) y pnpm (rápido, con enlaces duros). Desde npm 5, la diferencia en velocidad y funcionalidad entre npm y yarn es mínima. npm 7+ añadió workspaces, haciéndolo competitivo para monorepositorios.
| Característica | npm | yarn | pnpm |
|---|---|---|---|
| Año de creación | 2010 | 2016 | 2017 |
| Archivo de bloqueo | package-lock.json | yarn.lock | pnpm-lock.yaml |
| Instalación | Secuencial (npm 5+) | Paralela | Paralela |
| Espacio en disco | Estándar | Estándar | Mínimo (enlaces) |
| Workspaces | Sí (npm 7+) | Sí | Sí |
| Plug'n'Play | No | Sí | No |
Según State of JS 2025: el 62% de los desarrolladores usa npm, el 35% usa yarn (principalmente proyectos antiguos y entusiastas de PnP) y el 3% usa pnpm. Para proyectos React Native, ambas herramientas son igualmente viables, pero npm es más común en proyectos con Expo SDK 50+ y nuevas inicializaciones de React Native.
yarn conserva su ventaja en monorepositorios extremadamente grandes (100+ paquetes) gracias a su implementación más madura de workspaces y Plug'n'Play. pnpm gana en ahorro de espacio en disco mediante enlaces duros a un almacén global. La elección del gestor depende de las preferencias del equipo y la infraestructura.
Preguntas frecuentes
npm install actualiza package-lock.json y puede instalar nuevas versiones menores dentro del rango semántico. npm ci (Clean Install) elimina node_modules e instala paquetes estrictamente desde package-lock.json sin actualizarlo. npm ci es más rápido, se usa en CI/CD y garantiza un entorno idéntico en todas las máquinas. Si package-lock.json falta, npm ci lanza un error.
Desde npm 7, los conflictos de dependencias pares causan errores de compilación. Soluciones: actualizar todos los paquetes a versiones compatibles mediante npm update, usar la bandera --legacy-peer-deps para el modo npm 6, o añadir una sección overrides en package.json para forzar una versión específica de un paquete. La mejor opción es actualizar las dependencias a versiones compatibles.
npm audit escanea el árbol de dependencias en busca de vulnerabilidades conocidas de la base de datos de npm Security Advisory. El comando genera un informe con niveles de criticidad (critical, high, moderate, low) y recomienda npm audit fix para actualizar automáticamente los paquetes vulnerables a versiones seguras. Ejecutar npm audit regularmente es una práctica básica de seguridad en proyectos JavaScript.
npm workspaces permite gestionar múltiples paquetes en un único repositorio. Añada el campo "workspaces": ["packages/*"] al package.json raíz. Ventajas: instalación única de todas las dependencias en un node_modules compartido, enlaces simbólicos automáticos entre paquetes locales, ejecución de scripts para todos los paquetes desde la raíz y eliminación de la duplicación de versiones.
package-lock.json bloquea las versiones exactas de todas las dependencias y sus paquetes transitivos. Sin él, diferentes desarrolladores y servidores CI pueden obtener diferentes versiones de librerías dentro del rango semántico, lo que provoca errores de «en mi máquina funciona». Confirmar el archivo de bloqueo garantiza compilaciones reproducibles y un comportamiento idéntico en todos los entornos.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.