npm es un administrador de paquetes para el lenguaje de programación JavaScript mantenido por npm, Inc., una subsidiaria de GitHub . npm es el administrador de paquetes predeterminado para el entorno de ejecución de JavaScript Node.js y se incluye como una característica recomendada en el instalador de Node.js. [4]
Consiste en un cliente de línea de comandos, también llamado npm, y una base de datos en línea de paquetes públicos y privados de pago, llamada registro npm. Se accede al registro a través del cliente, y se pueden explorar y buscar los paquetes disponibles a través del sitio web de npm. El administrador de paquetes y el registro son administrados por npm, Inc.
Aunque comúnmente se entiende que "npm" es una abreviatura de "Node Package Manager", oficialmente es un acrónimo recursivo de "npm no es un acrónimo". [5]
npm fue desarrollado por Isaac Z. Schlueter como resultado de haber "visto que el empaquetado de módulos se hacía de manera terrible" y con la inspiración de otros proyectos similares como PEAR ( PHP ) y CPAN ( Perl ). [6] npm es un reemplazo de JavaScript para pm, un script de shell . [7]
La empresa npm, Inc. fue fundada en 2014 en Oakland, California , Estados Unidos, con Laurie Voss como cofundadora. Bryan Bogensberger se unió a la empresa como director ejecutivo en julio de 2018 y renunció en septiembre de 2019. [8] Antes de la renuncia de Bogensberger, Laurie Voss renunció en julio de 2019. [9]
En marzo de 2020, npm fue adquirida por GitHub , que es una subsidiaria de Microsoft .
npm puede gestionar paquetes que son dependencias locales de un proyecto en particular, así como herramientas de JavaScript instaladas globalmente. [10] Cuando se utiliza como un administrador de dependencias para un proyecto local, npm puede instalar, en un comando, todas las dependencias de un proyecto a través del package.json
archivo. [11] En el package.json
archivo, cada dependencia puede especificar un rango de versiones válidas utilizando el esquema de versiones semánticas, lo que permite a los desarrolladores actualizar automáticamente sus paquetes y, al mismo tiempo, evitar cambios no deseados. [12] npm también proporciona herramientas de actualización de versiones para que los desarrolladores etiqueten sus paquetes con una versión particular. [13] npm también proporciona el archivo package-lock.json
[14] que tiene la entrada de la versión exacta utilizada por el proyecto después de evaluar las versiones semánticas en package.json
.
El cliente de interfaz de línea de comandos de npm permite a los usuarios consumir y distribuir módulos de JavaScript que están disponibles en el registro. [15]
En febrero de 2018, se descubrió un problema en la versión 5.7.0 que, al ejecutarse sudo npm
en sistemas Linux, cambiaba la propiedad de los archivos del sistema, lo que dañaba permanentemente el sistema operativo. [16]
En la versión 6 de npm, se introdujo la función de auditoría para ayudar a los desarrolladores a identificar y corregir vulnerabilidades de seguridad en los paquetes instalados. [17] La fuente de las vulnerabilidades de seguridad se tomó de los informes encontrados en Node Security Platform (NSP) y se ha integrado con npm desde la adquisición de NSP por parte de npm. [18]
Los paquetes en el registro están en formato ECMAScript Module (ESM) o CommonJS e incluyen un archivo de metadatos en formato JSON . [19]
Hay más de 3,1 millones de paquetes disponibles en el registro principal de npm. [20]
El registro no tiene ningún proceso de verificación para el envío, lo que significa que los paquetes que se encuentran allí pueden ser potencialmente de baja calidad, inseguros o maliciosos. [19] En cambio, npm se basa en los informes de los usuarios para eliminar los paquetes si violan las políticas por ser de baja calidad, inseguros o maliciosos. [21] npm expone estadísticas que incluyen la cantidad de descargas y la cantidad de paquetes dependientes para ayudar a los desarrolladores a juzgar la calidad de los paquetes. [22]
Internamente, npm se basa en la base de datos NoSQL Couch para administrar los datos disponibles públicamente. [23]
En marzo de 2016, un paquete llamado left-pad
fue despublicado como resultado de una disputa de nombres entre Azer Koçulu, un ingeniero de software individual, y Kik . [24] [25] El paquete fue inmensamente popular en la plataforma, siendo dependiente de miles de proyectos y alcanzó 15 millones de descargas antes de su eliminación. [24] [26] Varios proyectos críticos para el ecosistema de JavaScript, incluidos Babel y Webpack, dependían de él left-pad
y se volvieron inutilizables. [27] Aunque el paquete se volvió a publicar tres horas después, [28] causó una interrupción generalizada, lo que llevó a npm a cambiar sus políticas con respecto a la despublicación para evitar un evento similar en el futuro. [29]
En marzo de 2022, el desarrollador Brandon Nozaki Miller , mantenedor del node-ipc
paquete, agregó peacenotwar
como dependencia al paquete; peacenotwar
sobrescribe recursivamente el contenido del disco duro de una máquina afectada con el emoji de corazón si tienen una dirección IP bielorrusa o rusa. El paquete también deja un archivo de texto en la máquina que contiene un mensaje en protesta por la invasión rusa de Ucrania . Vue.js , que usa node-ipc
como dependencia, no ancló sus dependencias a una versión segura, lo que significa que algunos usuarios de Vue.js se vieron afectados por el paquete malicioso si la dependencia se obtuvo como el paquete más reciente. [30] [31] La dependencia afectada también estuvo presente brevemente en la versión 3.1 de Unity Hub ; sin embargo, se lanzó una revisión el mismo día para eliminar el problema. [32]
En noviembre de 2018, se descubrió que se había añadido un paquete malicioso como dependencia a la versión 3.3.6 del popular paquete event-stream
. [33] El paquete malicioso, llamado flatmap-stream
, contenía una carga útil cifrada que robaba bitcoins de ciertas aplicaciones. [34]
En mayo de 2021, pac-resolver
se descubrió que un paquete npm que recibía más de 3 millones de descargas por semana tenía una vulnerabilidad de ejecución remota de código . [35] La vulnerabilidad era resultado de la forma en que el paquete entregaba los archivos de configuración y se solucionó en las versiones 5 y posteriores. [36]
En enero de 2022, el mantenedor del popular paquete colors
envió cambios que imprimían texto basura en un bucle infinito. [26] El mantenedor también limpió el repositorio de otro paquete popular, faker
, y su paquete en npm, y lo reemplazó con un README que decía: "¿Qué le pasó realmente a Aaron Swartz ?" [37]
En mayo de 2023, se descubrió que varios paquetes npm, incluidos los mencionados anteriormente bignum
, habían sido explotados y robaban credenciales de usuario e información de las máquinas afectadas. Los investigadores descubrieron que estos paquetes habían sido comprometidos mediante un exploit que involucraba los buckets de Amazon S3 y la node-gyp
herramienta de línea de comandos. [38]
Hay varias alternativas de código abierto a npm para instalar JavaScript modular, entre las que se incluyen pnpm , Yarn , [39] Bun y Deno . Deno y Bun también proporcionan un entorno de ejecución de JavaScript, mientras que solo Deno opera de forma independiente de NPM Registry o de cualquier repositorio centralizado [40] y su compatibilidad con NPM Registry sigue siendo un tema de trabajo en curso a partir de enero de 2024. [41] Todos son compatibles con el registro público de npm y lo utilizan de forma predeterminada, pero proporcionan diferentes experiencias del lado del cliente, generalmente centradas en mejorar el rendimiento y el determinismo en comparación con el cliente de npm. [42]