npm es un administrador de paquetes para el lenguaje de programación JavaScript mantenido por npm, Inc. npm es el administrador de paquetes predeterminado para el entorno de ejecución de JavaScript Node.js y se incluye como 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 los paquetes disponibles se pueden explorar y buscar a través del sitio web de npm. El administrador de paquetes y el registro son administrados por npm, Inc.
npm fue desarrollado por Isaac Z. Schlueter como resultado de haber "visto el empaquetado de módulos hecho terriblemente" y con la inspiración de otros proyectos similares como PEAR ( PHP ) y CPAN ( Perl ). [5] npm es un reemplazo de JavaScript para pm, un script de shell . [6] Si bien se entiende comúnmente que "npm" es una abreviatura de "Node Package Manager", oficialmente significa "npm no es un acrónimo". [7]
En marzo de 2020 se anunció que GitHub adquirirá npm . [1]
npm puede administrar paquetes que son dependencias locales de un proyecto en particular, así como herramientas JavaScript instaladas globalmente. [8] Cuando se utiliza como administrador de dependencias para un proyecto local, npm puede instalar, en un solo comando, todas las dependencias de un proyecto a través del package.json
archivo. [9] En el package.json
archivo, cada dependencia puede especificar un rango de versiones válidas utilizando el esquema de control de versiones semántico, lo que permite a los desarrolladores actualizar automáticamente sus paquetes y al mismo tiempo evitar cambios importantes no deseados. [10] npm también proporciona herramientas de modificación de versiones para que los desarrolladores etiqueten sus paquetes con una versión particular. [11] npm también proporciona el archivo package-lock.json
[12] que tiene la entrada de la versión exacta utilizada por el proyecto después de evaluar el control de versiones semántico en package.json
.
El cliente de interfaz de línea de comandos de npm permite a los usuarios consumir y distribuir módulos JavaScript que están disponibles en el registro. [13]
En febrero de 2018, se descubrió un problema en la versión 5.7.0 en el que la ejecución sudo npm
en sistemas Linux cambiaba la propiedad de los archivos del sistema, rompiendo permanentemente el sistema operativo. [14]
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. [15] 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. [dieciséis]
Los paquetes del registro están en formato ECMAScript Module (ESM) o CommonJS e incluyen un archivo de metadatos en formato JSON . [17]
Más de 1,3 millones de paquetes están disponibles en el registro principal de npm. [18]
El registro no tiene ningún proceso de verificación de envío, lo que significa que los paquetes encontrados allí pueden ser potencialmente de baja calidad, inseguros o maliciosos. [17] En cambio, npm se basa en los informes de los usuarios para eliminar paquetes si violan las políticas por ser de baja calidad, inseguros o maliciosos. [19] npm expone estadísticas que incluyen el número de descargas y el número de paquetes dependientes para ayudar a los desarrolladores a juzgar la calidad de los paquetes. [20]
Internamente, npm se basa en NoSQL Couch DB para administrar los datos disponibles públicamente. [21]
En marzo de 2016, npm atrajo la atención de la prensa [22] después de que un paquete llamado left-pad
, del que dependían muchos paquetes JavaScript populares, no se publicara como resultado de una disputa de nombre entre Azer Koçulu, un ingeniero de software individual, y Kik . [23] [24] Aunque el paquete se volvió a publicar tres horas después, [25] 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. [26]
En abril de 2020, un pequeño paquete llamado is-promise
provocó una interrupción en las implementaciones y aplicaciones sin servidor en todo el mundo por ser una dependencia de muchas aplicaciones grandes e importantes. [27] [ se necesita fuente no primaria ]
En julio de 2018, las credenciales npm de un mantenedor del popular eslint-scope
paquete se vieron comprometidas, lo que resultó en una versión maliciosa de eslint-scope
la versión 3.7.2. El código malicioso copió las credenciales npm de la máquina en ejecución eslint-scope
y las cargó al atacante. [28]
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
. El paquete malicioso, llamado flatmap-stream
, contenía una carga útil cifrada que robaba bitcoins de ciertas aplicaciones. Los administradores de npm eliminaron el paquete infractor. [29] [30]
En enero de 2022, el mantenedor del popular paquete colors
impulsó cambios que imprimían texto basura en un bucle infinito. El mantenedor también borró el repositorio de otro paquete popular, faker
, y su paquete en npm, y lo reemplazó con un archivo README que decía: "¿Qué le pasó realmente a Aaron Swartz ?" [31]
En marzo de 2022, el desarrollador Brandon Nozaki Miller lanzó una versión del paquete node-ipc
que contenía código malicioso que eliminaría archivos de usuarios con direcciones IP bielorrusas y rusas, en protesta por la invasión rusa de Ucrania . Vue.js , que se utiliza node-ipc
como dependencia, no fijó sus dependencias en 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. [32] [33] La dependencia afectada también estuvo presente brevemente en la versión 3.1 de Unity Hub ; Sin embargo, el mismo día se publicó una revisión para solucionar el problema. [34]
Hay una serie de alternativas de código abierto a npm para instalar JavaScript modular, incluidas , , ied
Yarn pnpm
, [ 35 ] Bun y Deno . Deno y Bun también proporcionan un tiempo de ejecución de JavaScript, mientras que solo Deno opera independientemente del Registro NPM o de cualquier repositorio centralizado [36] y su compatibilidad con el registro NPM sigue siendo un tema de trabajo en curso a partir de enero de 2024. [37] Todos ellos son compatible con el registro público npm y lo usa de forma predeterminada, pero proporciona diferentes experiencias del lado del cliente, generalmente enfocadas en mejorar el rendimiento y el determinismo en comparación con el cliente npm. [38]npmd