1649481840
Un administrador de paquetes es una herramienta que usan los desarrolladores para automatizar la búsqueda, descarga, instalación, configuración, actualización y eliminación de paquetes de un sistema.
Este artículo le mostrará todo lo que necesita para comenzar con los administradores de paquetes como NPM e Yarn.
Pero, ¿por qué exactamente necesitamos un administrador de paquetes en nuestro flujo de trabajo de desarrollo? Vamos a averiguar.
Supongamos que no hubiera administradores de paquetes. En ese caso, tendría que hacer lo siguiente manualmente:
La gestión manual de decenas o cientos de paquetes es una tarea tediosa y que requiere mucho tiempo.
Por lo tanto, los administradores de paquetes, como NPM , pNPM , Bower e Yarn , ayudan a automatizar y eliminar el tedioso proceso de administrar todos sus paquetes manualmente.
Tenga en cuenta que un administrador de paquetes no es lo mismo que un registro de paquetes. Entonces, descubramos la principal diferencia.
Un administrador de paquetes es una herramienta que usan los desarrolladores para buscar, descargar, instalar, configurar, actualizar y desinstalar automáticamente los paquetes de una computadora.
NPM (Node Package Manager) e Yarn (Yet Another Resource Negotiator) son dos administradores de paquetes de uso popular.
Un registro de paquetes es una base de datos (almacenamiento) para miles de paquetes (bibliotecas, complementos, marcos o herramientas).
En otras palabras, un registro de paquetes es el lugar desde el que se publican y se instalan los paquetes.
El registro de NPM y los paquetes de GitHub son dos registros de paquetes de uso popular.
Entonces, ahora que sabemos qué es un administrador de paquetes y por qué es necesario, podemos discutir cómo usar los dos populares: NPM e Yarn.
Tenga en cuenta que existen numerosos debates entre NPM y Yarn, por lo que los evitaremos aquí porque el mejor administrador de paquetes es el que mejor funciona para usted.
Por lo tanto, este artículo le mostrará cómo funcionan NPM e Yarn en lugar de decirle qué administrador de paquetes es el mejor. A continuación, depende de usted decidir cuál prefiere.
Como alternativa, puede optar por usar NPM para un proyecto específico e Yarn para otro, según el gerente que crea que es el más adecuado para el trabajo.
Entonces, sin más preámbulos, comencemos aprendiendo cómo instalar los dos administradores.
NPM se instala automáticamente al instalar Node.
Por lo tanto, para instalar NPM en su sistema, vaya al sitio web de NodeJS y obtenga el último LTS de Node o la versión actual .
Lo mejor es instalar Yarn a través de NPM. Entonces, primero, instale NPM desde el sitio web de Node.js.
Una vez que haya instalado NPM, proceda a instalar Yarn así:
npm install -g yarn
Para verificar la versión de Node.js instalada en su sistema, ejecute:
node -v
La -v
bandera en el fragmento anterior es una abreviatura de --version
.
Para verificar la versión de NPM instalada en su sistema, ejecute:
npm -v
Para verificar la versión de Yarn instalada en su sistema, ejecute:
yarn -v
Actualice a la última versión de NPM ejecutando:
npm install npm@latest -g
Suponga que desea actualizar su instalación de Node.js. En ese caso, tienes dos opciones:
Una forma de actualizar su instalación de NodeJS es descargar e instalar manualmente la última versión desde el sitio web de Node.js.
Otra forma de actualizar su instalación de NodeJS es usar un administrador de versiones como NVM , n o nvs .
Actualice a la última versión de Yarn ejecutando:
yarn set version latest
Entonces, ahora que tenemos NPM (o Yarn) en nuestra computadora, podemos comenzar a usar el administrador instalado para buscar, instalar, configurar y eliminar los paquetes de nuestro proyecto.
Pero, ¿qué es exactamente un paquete? Vamos a averiguar.
Un paquete es un directorio (o proyecto) que tiene un package.json
archivo que se usa para registrar información sobre él.
Nota: solo puede publicar paquetes (un proyecto descrito por un package.json
archivo) en el registro de NPM .
Hay dos formas de instalar un paquete: local o globalmente.
Un paquete instalado localmente es uno que puede usar solo en el proyecto en el que lo instaló.
Para instalar un paquete localmente, haga lo siguiente:
Nota: Debe tener Node y NPM instalados en su sistema para que funcionen los siguientes comandos de instalación de NPM (e Yarn). Puede obtener ambos instalando el último LTS o la versión actual del sitio web de Node.js.
npm install package-name --save
Tenga en cuenta que el --save
comando anterior indica a NPM que guarde package-name
el package.json
archivo como uno de los paquetes de los que depende el proyecto.
Suponga que desea instalar una versión exacta de un paquete. En tal caso, agregue un @[version-number]
después del nombre del paquete así:
npm install package-name@4.14.1 --save
Alternativamente, si el paquete que está instalando es para fines de desarrollo y prueba, use:
npm install package-name --save-dev
Los comandos anteriores harán que NPM descargue tres elementos en el directorio raíz de su proyecto: una node_modules
carpeta, un package.json
archivo y un package-lock.json
archivo. Discutiremos estos elementos en detalle más adelante en este artículo.
yarn add package-name
Suponga que desea instalar una versión exacta de un paquete. En tal caso, agregue un @[version-number]
después del nombre del paquete así:
yarn add package-name@4.14.1
Alternativamente, si el paquete que está instalando es para fines de desarrollo y prueba, use:
yarn add package-name --dev
Los comandos anteriores harán que Yarn descargue tres elementos en el directorio raíz de su proyecto: una node_modules
carpeta, un package.json
archivo y un yarn.lock
archivo. Discutiremos estos elementos en detalle más adelante en este artículo.
Entonces, ahora que sabemos cómo instalar un paquete localmente, podemos analizar la instalación del paquete global.
Un paquete instalado globalmente es un paquete que puede usar en cualquier parte de su sistema.
Para instalar un paquete globalmente, ejecute el siguiente código en su terminal:
npm install package-name -g
Alternativamente, puedes usar Yarn así:
yarn global add package-name
Tenga en cuenta que puede ejecutar los comandos anteriores desde cualquier ubicación de su sistema.
Generalmente, es mejor instalar un paquete localmente. A continuación se muestran algunas de las diferencias entre una instalación local y una global.
Un paquete instalado localmente se instala en el directorio donde ejecutó el comando npm install package-name
(o ).yarn add package-name
Específicamente, encontrará los paquetes instalados localmente de un proyecto en su node_module
directorio.
Por el contrario, un paquete instalado globalmente se instala en una sola ubicación en su sistema. La ubicación exacta depende de la configuración de su sistema.
Supongamos que instaló su paquete localmente. Luego, puede usar diferentes versiones del mismo paquete para el desarrollo de múltiples aplicaciones.
Sin embargo, se ve obligado a usar la misma versión del paquete para todas sus aplicaciones cuando las instala globalmente.
Una instalación local le permite elegir los paquetes del proyecto que desea actualizar a la última versión. Esto facilita la gestión de actualizaciones que rompen la compatibilidad con otros paquetes.
Sin embargo, actualizar un paquete instalado globalmente actualiza el paquete para todos los proyectos, lo que puede causar pesadillas de mantenimiento si la actualización rompe la compatibilidad con otros paquetes.
La instalación global es mejor para los paquetes que pretende usar solo en su línea de comandos, especialmente cuando proporcionan comandos ejecutables reutilizables en todos los proyectos.
Sin embargo, la instalación local es mejor para los paquetes que pretende usar en su programa, a través de la import
instrucción o la require()
función.
NPM , React Native CLI , Gatsby CLI , Grunt CLI y Vue CLI son ejemplos bien conocidos de paquetes globales.
Los ejemplos comunes de paquetes locales son Webpack , Lodash , Jest y MomentJS .
Nota:
node_modules
directorio. Y si hubiera especificado el --save
comando, su gerente agregaría detalles sobre el paquete al package.json
archivo.Pero, ¿qué son exactamente la node_modules
carpeta, package.json
el archivo, package-lock.json
el archivo y yarn.lock
el archivo? Vamos a averiguar.
node_modules
carpeta?El directorio node_modules es la carpeta donde NPM coloca todos los paquetes que descarga localmente para su proyecto.
package.json
archivo?Un archivo package.json es un documento JSON que los administradores de paquetes, como NPM e Yarn, usan para almacenar información sobre un proyecto específico.
En otras palabras, un package.json
archivo es un archivo de metadatos de un proyecto.
package.json
archivoun package.json
archivo:
package.json
archivoVaya al directorio raíz de su proyecto e inicie la creación de un package.json
archivo ejecutando:
npm init
O, si su administrador de paquetes es Yarn, ejecute:
yarn init
Una vez que haya ejecutado el comando de inicialización anterior, su administrador de paquetes lo guiará a través de la creación del package.json
archivo haciéndole algunas preguntas sobre su proyecto.
Si desea omitir el cuestionario, puede crear un package.json
archivo predeterminado. Veamos cómo.
package.json
archivo predeterminadoSuponga que prefiere omitir el cuestionario solicitado por el comando npm init
(o ). yarn init
En tal caso, vaya al directorio raíz de su proyecto y ejecute:
npm init -y
O, si su administrador de paquetes es Yarn, ejecute:
yarn init -y
El comando anterior utilizará los valores predeterminados extraídos del directorio actual para crear el package.json
archivo de su proyecto.
Nota: La -y
bandera es una abreviatura de --yes
.
Una vez que su administrador de paquetes termine su proceso de inicialización, el package.json
archivo de su proyecto contendrá un objeto con un conjunto de propiedades.
Aquí hay un ejemplo:
{
"name": "codesweetly-project",
"version": "1.0.0",
"main": "index.js"
}
Puede ver que el package.json
archivo anterior contiene los campos name
, version
y . main
Aprendamos más sobre estas propiedades a continuación.
package.json
campos deLas package.json
propiedades de hacen que su proyecto sea útil para administradores de paquetes y usuarios finales.
Suponga que desea publicar su paquete en el registro de NPM. En ese caso, su package.json
archivo debe tener los campos "name"
y ."version"
Sin embargo, si no tiene la intención de publicar su paquete, en ese caso, todos los campos, incluidas las propiedades "name"
y "version"
, son opcionales.
Aprendamos más sobre los campos de uso común en un package.json
archivo.
El "name"
campo es una propiedad utilizada para registrar el nombre de un proyecto.
El "name"
valor de la propiedad debe ser:
Tenga en cuenta que puede unir palabras con guiones y guiones bajos.
Aquí hay un ejemplo:
{
"name": "code_sweetly-project"
}
El "version"
campo indica el número de versión actual de un proyecto.
La "version"
propiedad debe tener la forma de un major.minor.patch
formato. También debe seguir las pautas de control de versiones semánticas .
Aquí hay un ejemplo:
{
"version": "1.0.0"
}
El "description"
campo es una propiedad que contiene una breve descripción del propósito de un proyecto.
NPM recomienda tener una "description"
propiedad para que su paquete sea más fácil de encontrar en el sitio web de NPM.
Su descripción será una de las cosas que se mostrarán cuando las personas ejecuten el npm search
comando.
Aquí hay un ejemplo:
{
"description": "A brief description about this package (project)"
}
El "main"
campo indica el punto de entrada de un proyecto .
En otras palabras, cuando alguien ejecuta la require()
función, Node resolverá la invocación en require(<package.json:main>)
.
Aquí hay un ejemplo:
{
"main": "./src/index.js"
}
El "private"
campo permite que los administradores de paquetes sepan si deben publicar su proyecto en el registro de NPM.
Aquí hay un ejemplo:
{
"private": true
}
Si establece la "private"
propiedad de su paquete.json en true
, los administradores de paquetes no publicarán su proyecto.
Por lo tanto, configurar la propiedad es una excelente manera de evitar la publicación accidental de su paquete.
El "scripts"
campo define los comandos de script que desea ejecutar en varios momentos del ciclo de vida de su proyecto.
Aquí hay un ejemplo:
{
"scripts": {
"test": "jest",
"dev": "webpack --mode development",
"build": "webpack --mode production",
"predeploy": "npm run build",
"deploy": "gh-pages -d build"
}
}
El "scripts"
campo de arriba contiene cinco propiedades cuyos valores son los comandos que queremos que nuestro administrador de paquetes ejecute cada vez que invoquemos la clave de la propiedad.
Entonces, por ejemplo, ejecutar npm run dev
ejecutará el "webpack --mode development"
comando.
El "keywords"
campo especifica una serie de palabras clave que pueden ayudar a las personas a descubrir su paquete.
Aquí hay un ejemplo:
{
"keywords": [
"drag",
"drop",
"drag and drop",
"dragndrop",
"draggable"
]
}
La "keywords"
propiedad es parte de la información que se muestra cuando las personas ejecutan el npm search
comando.
El "author"
campo enumera los detalles del autor de un proyecto.
Aquí hay un ejemplo:
{
"author": "Oluwatobi Sofela <oluwatobiss@codesweetly.com> (https://www.codesweetly.com)"
}
También puede escribir el fragmento anterior como:
{
"author": {
"name": "Oluwatobi Sofela",
"email": "oluwatobiss@codesweetly.com",
"url": "https://www.codesweetly.com"
}
}
Tenga en cuenta que las propiedades "email"
y "url"
son opcionales.
El "dependencies"
campo enumera todos los paquetes de los que depende un proyecto en producción.
Aquí hay un ejemplo:
{
"dependencies": {
"first-package": "^1.0.4",
"second-package": "~2.1.3"
}
}
Por lo tanto, cada vez que un usuario instala su proyecto desde el registro de NPM, la propiedad de dependencias garantiza que los administradores de paquetes puedan encontrar e instalar automáticamente los paquetes enumerados.
Tenga en cuenta que puede agregar un paquete al "dependencies"
campo a través de cualquiera de las siguientes formas:
npm install package-name --save-prod
comando en su terminal. O yarn add package-name
si Yarn es su administrador de paquetes.El "devDependencies"
campo enumera todos los paquetes que un proyecto no necesita en producción, pero requiere para su desarrollo local y fines de prueba.
Aquí hay un ejemplo:
{
"devDependencies": {
"first-dev-package": "^5.8.1",
"second-dev-package": "3.2.2—4.0.0"
}
}
Tenga en cuenta que los paquetes enumerados en el "devDependencies"
campo estarán disponibles en el entorno de desarrollo del proyecto, pero no en su servidor de producción.
Supongamos que un usuario instala el proyecto mediante el comando npm install
(o ). yarn add
En tal caso, el administrador de paquetes encontrará y descargará todos los listados devDependencies
en el directorio del proyecto node_modules
.
Tenga en cuenta que puede agregar un paquete al "devDependencies"
campo a través de cualquiera de las siguientes formas:
npm install package-name --save-dev
comando en su terminal. O yarn add package-name --dev
si Yarn es su administrador de paquetes.El "homepage"
campo especifica la URL de la página de inicio de su proyecto.
Aquí hay un ejemplo:
{
"homepage": "https://codesweetly.com/package-json-file-explained"
}
Entonces, ahora que sabemos qué package.json
es un archivo, podemos discutir package-lock.json
.
package-lock.json
archivo?El archivo package-lock.json es un documento que NPM usa para registrar la versión exacta de todos los paquetes que ha instalado localmente en el node_modules
directorio de su proyecto.
Un package-lock.json
archivo hace que una aplicación sea 100 % reproducible de la forma exacta en que la publicaste en el registro de NPM.
Entonces, suponga que un usuario clona su aplicación y ejecuta el npm install
comando. En tal caso, package-lock.json
asegura que el usuario descargue la versión exacta de los paquetes que utilizó para desarrollar la aplicación.
Por ejemplo, supongamos que un usuario clonó su aplicación que no contiene ningún package-lock.json
archivo y una dependencia utilizada en la aplicación tiene una versión más nueva.
Supongamos que el número de versión de la dependencia en el package.json
archivo tiene un signo de intercalación (por ejemplo, ^2.6.2
). En ese caso, NPM instalará la versión secundaria más reciente de la dependencia, lo que podría provocar que la aplicación produzca resultados erróneos.
Sin embargo, suponga que el usuario clonó su aplicación que contiene un package-lock.json
archivo. En ese caso, NPM instalará la versión exacta de la dependencia registrada en el package-lock.json
archivo, independientemente de si existe una versión más reciente.
Por lo tanto, los usuarios siempre obtendrán su aplicación de la manera precisa en que la publicó en el registro de NPM.
En otras palabras, NPM usa el package-lock.json
archivo para bloquear las dependencias de su paquete a los números de versión específicos que usó para el desarrollo del proyecto.
Nota: NPM actualizará los paquetes registrados en el package-lock.json
archivo cada vez que ejecute el npm update
comando.
yarn.lock
archivo?El yarn.lock
archivo es un documento que Yarn usa para registrar la versión exacta de todos los paquetes que ha instalado localmente en el node_modules
directorio de su proyecto.
El yarn.lock
archivo es comparable al archivo de bloqueo package-lock.json de NPM .
Anteriormente mencionamos que su administrador de paquetes no ejecuta un paquete instalado; debe hacerlo usted mismo explícitamente. Discutamos cómo.
Hay varias formas de ejecutar un paquete ejecutable. A continuación se muestran las técnicas estándar.
Una forma de ejecutar un paquete ejecutable es escribir su ruta local en la línea de comandos de la siguiente manera:
./node_modules/.bin/package-name
scripts
campo de package.jsonUna forma alternativa de ejecutar un paquete es agregarlo primero al "scripts"
campo del archivo package.json de su proyecto de esta manera:
{
"name": "your_package",
"version": "1.0.0",
"scripts": {
"desired-name": "name-of-package-to-execute"
}
}
Luego, puede ejecutar el paquete así:
npm run desired-name
Tenga en cuenta que el comando anterior es una abreviatura de npm run-script desired-name
.
Alternativamente, puede ejecutar el paquete con Yarn así:
yarn run desired-name
Aquí hay un ejemplo:
{
"name": "codesweetly-app",
"version": "1.0.0",
"scripts": {
"build": "webpack",
}
}
El fragmento anterior agregó un paquete web a su package.json
campo "scripts"
. Entonces, ahora podemos ejecutar webpack
en la línea de comando de esta manera:
npm run build
O, si su administrador de paquetes es Yarn, puede ejecutar un paquete web como este:
yarn run build
Una forma más rápida de ejecutar un paquete ejecutable es usar NPX así:
npx package-name
Con NPX, ya no necesita agregar su paquete al "scripts"
campo del package.json
archivo de su proyecto.
NPX (Node Package Execute) es un ejecutor de paquetes de Node que busca y ejecuta automáticamente un paquete específico.
Aquí hay un ejemplo:
npx webpack
El comando anterior encontrará y ejecutará automáticamente webpack . Por lo tanto, no necesitamos agregar la "build": "webpack"
propiedad al "scripts"
campo de nuestro package.json
archivo.
Nota: NPX se instala automáticamente cuando instala Node 8.2/NPM 5.2.0 o superior.
También puede ejecutar código con su versión preferida de Node.js. Averigüemos cómo.
Puede usar el @
carácter y el paquete node npm para especificar la versión de Node.js que desea usar para ejecutar su código.
Aquí hay un ejemplo:
npx node@7 index.js
El fragmento anterior le dice a NPX que se ejecute index.js
con la última versión de Node desde la versión 7 principal.
Usar el node@
comando es una forma útil de evitar el uso de herramientas de administración de versiones de Node.js como nvm para cambiar entre versiones de Node.
Suponga que desea confirmar la versión de nodo que utilizará NPX para ejecutar su código. En ese caso, ejecuta:
npx node@7 -v
El fragmento anterior mostrará la última versión de Node de la versión 7 principal que NPX usará para ejecutar su código, por ejemplo, v7.10.1
.
Para determinar si alguno de los paquetes de su proyecto está desactualizado, ejecute:
npm outdated
Si el comando no genera nada, significa que todos los paquetes de su proyecto están actualizados.
De lo contrario, consulte este artículo obsoleto de npm para obtener una explicación detallada de la salida del comando.
Alternativamente, puedes usar Yarn así:
yarn outdated
Nota: para verificar el estado desactualizado de un paquete específico, agregue el nombre del paquete después de la outdated
palabra clave, por ejemplo, npm outdated lodash
.
Para confirmar qué paquete global está desactualizado, ejecute:
npm outdated -g --depth=0
Aquí hay tres formas de verificar los paquetes instalados localmente:
npm list
O usa Yarn así:
yarn list
npm list --depth=0
O,
yarn list --depth=0
npm list package-name
Aquí hay tres formas de verificar los paquetes instalados globalmente:
npm list -g
O usa Yarn así:
yarn list -g
npm list -g --depth=0
O,
yarn list -g --depth=0
npm list -g package-name
Aquí se explica cómo actualizar paquetes con NPM e Yarn:
npm update package-name
O, para proyectos administrados con Yarn, ejecute:
yarn upgrade package-name
npm update
O,
yarn upgrade
Puede actualizar un paquete instalado globalmente como este:
npm update package-name -g
npm update -g
Aquí se explica cómo desinstalar paquetes con NPM e Yarn:
Primero, navegue hasta el directorio raíz del proyecto desde la línea de comando y ejecute:
npm uninstall package-name
Nota:
-S
(o --save
) para eliminar las referencias al paquete en el dependencies
campo del package.json
archivo del proyecto.-D
(o --save-dev
) para eliminar las referencias al paquete en el devDependencies
campo del package.json
archivo del proyecto.Para proyectos administrados con Yarn, ejecute:
yarn remove package-name
Nota: El yarn remove
comando actualizará automáticamente los archivos package.json
y el proyecto.yarn.lock
npm uninstall package-name -g
Tenga en cuenta que es una buena práctica no eliminar paquetes manualmente de la node_modules
carpeta, ya que tal acción puede afectar a otros módulos dependiendo de ella.
Pero, ¿qué es exactamente un módulo en NodeJS? Averigüémoslo a continuación.
Un módulo en NodeJS es cualquier archivo en la node_modules
carpeta que la computadora puede cargar a través de la función de Node require()
.
Aquí hay un ejemplo:
const myModule = require("./codesweetly.js");
Suponga que la computadora usó con éxito la require()
función para cargar el codesweetly.js
archivo. En tal caso, significa que codesweetly.js
es un módulo asignado a la myModule
variable.
Tenga en cuenta que un módulo también puede ser un paquete, pero no siempre.
Un módulo no es un paquete si no tiene un package.json
archivo utilizado para registrar información sobre él.
Además, tenga en cuenta que para que la función pueda cargar un módulo require()
, el módulo debe ser uno de los siguientes:
package.json
archivo contiene un "main"
campo.NPM es un registro gratuito para autores de paquetes públicos .
Entonces, puede usarlo para publicar cualquier proyecto (carpeta) desde su computadora que tenga un package.json
archivo.
A continuación se detallan los pasos necesarios para compartir su paquete con el mundo.
Vaya al sitio web de NPM e inicie sesión (o regístrese si aún no tiene una cuenta).
Nota: asegúrese de verificar su correo electrónico después de crear una nueva cuenta. De lo contrario, obtendrá un 403 Forbidden
error al publicar su paquete.
Inicie sesión en su cuenta de NPM desde la línea de comandos de la siguiente manera:
npm login
Nota: Puede usar el npm whoami
comando para verificar si está conectado actualmente.
Vaya al directorio raíz de su proyecto y publíquelo así:
npm publish
Asegúrese de que el nombre de su paquete no exista actualmente en NPM. De lo contrario, obtendrá un error durante la publicación.
Puede usar el npm search
comando (o la barra de búsqueda del sitio web de NPM ) para buscar si el nombre que desea usar ya existe en NPM.
Supongamos que ya se han tomado todos los nombres adecuados para su paquete. En ese caso, NPM le permite publicar su proyecto como un alcance.
En otras palabras, puede publicar su paquete como una subsección de su nombre de usuario. Veamos cómo a continuación.
Abra su package.json
archivo y prefije el nombre de su paquete con su nombre de usuario.
Aquí hay un ejemplo:
{
"name": "@username/package-name",
"version": "1.0.0",
"main": "index.js",
"license": "MIT"
}
La configuración predeterminada de NPM asume que un paquete de nombres con ámbito es un proyecto privado. Por lo tanto, obtendrá un error si usa el npm publish
comando para compartir un paquete de nombre con ámbito.
Por lo tanto, para publicar su paquete como ámbito de su nombre de usuario, agregue la --access=public
bandera al npm publish
comando:
npm publish --access=public
Nota: puede convertir su proyecto en un paquete con ámbito durante el proceso de inicialización utilizando el npm init --scope=username
comando en lugar de npm init
.
Este artículo discutió qué es un administrador de paquetes. También analizamos cómo funcionan dos administradores de paquetes populares (NPM e Yarn).
¡Gracias por leer!
Fuente: https://www.freecodecamp.org/news/javascript-package-manager-npm-and-yarn/
1649481840
Un administrador de paquetes es una herramienta que usan los desarrolladores para automatizar la búsqueda, descarga, instalación, configuración, actualización y eliminación de paquetes de un sistema.
Este artículo le mostrará todo lo que necesita para comenzar con los administradores de paquetes como NPM e Yarn.
Pero, ¿por qué exactamente necesitamos un administrador de paquetes en nuestro flujo de trabajo de desarrollo? Vamos a averiguar.
Supongamos que no hubiera administradores de paquetes. En ese caso, tendría que hacer lo siguiente manualmente:
La gestión manual de decenas o cientos de paquetes es una tarea tediosa y que requiere mucho tiempo.
Por lo tanto, los administradores de paquetes, como NPM , pNPM , Bower e Yarn , ayudan a automatizar y eliminar el tedioso proceso de administrar todos sus paquetes manualmente.
Tenga en cuenta que un administrador de paquetes no es lo mismo que un registro de paquetes. Entonces, descubramos la principal diferencia.
Un administrador de paquetes es una herramienta que usan los desarrolladores para buscar, descargar, instalar, configurar, actualizar y desinstalar automáticamente los paquetes de una computadora.
NPM (Node Package Manager) e Yarn (Yet Another Resource Negotiator) son dos administradores de paquetes de uso popular.
Un registro de paquetes es una base de datos (almacenamiento) para miles de paquetes (bibliotecas, complementos, marcos o herramientas).
En otras palabras, un registro de paquetes es el lugar desde el que se publican y se instalan los paquetes.
El registro de NPM y los paquetes de GitHub son dos registros de paquetes de uso popular.
Entonces, ahora que sabemos qué es un administrador de paquetes y por qué es necesario, podemos discutir cómo usar los dos populares: NPM e Yarn.
Tenga en cuenta que existen numerosos debates entre NPM y Yarn, por lo que los evitaremos aquí porque el mejor administrador de paquetes es el que mejor funciona para usted.
Por lo tanto, este artículo le mostrará cómo funcionan NPM e Yarn en lugar de decirle qué administrador de paquetes es el mejor. A continuación, depende de usted decidir cuál prefiere.
Como alternativa, puede optar por usar NPM para un proyecto específico e Yarn para otro, según el gerente que crea que es el más adecuado para el trabajo.
Entonces, sin más preámbulos, comencemos aprendiendo cómo instalar los dos administradores.
NPM se instala automáticamente al instalar Node.
Por lo tanto, para instalar NPM en su sistema, vaya al sitio web de NodeJS y obtenga el último LTS de Node o la versión actual .
Lo mejor es instalar Yarn a través de NPM. Entonces, primero, instale NPM desde el sitio web de Node.js.
Una vez que haya instalado NPM, proceda a instalar Yarn así:
npm install -g yarn
Para verificar la versión de Node.js instalada en su sistema, ejecute:
node -v
La -v
bandera en el fragmento anterior es una abreviatura de --version
.
Para verificar la versión de NPM instalada en su sistema, ejecute:
npm -v
Para verificar la versión de Yarn instalada en su sistema, ejecute:
yarn -v
Actualice a la última versión de NPM ejecutando:
npm install npm@latest -g
Suponga que desea actualizar su instalación de Node.js. En ese caso, tienes dos opciones:
Una forma de actualizar su instalación de NodeJS es descargar e instalar manualmente la última versión desde el sitio web de Node.js.
Otra forma de actualizar su instalación de NodeJS es usar un administrador de versiones como NVM , n o nvs .
Actualice a la última versión de Yarn ejecutando:
yarn set version latest
Entonces, ahora que tenemos NPM (o Yarn) en nuestra computadora, podemos comenzar a usar el administrador instalado para buscar, instalar, configurar y eliminar los paquetes de nuestro proyecto.
Pero, ¿qué es exactamente un paquete? Vamos a averiguar.
Un paquete es un directorio (o proyecto) que tiene un package.json
archivo que se usa para registrar información sobre él.
Nota: solo puede publicar paquetes (un proyecto descrito por un package.json
archivo) en el registro de NPM .
Hay dos formas de instalar un paquete: local o globalmente.
Un paquete instalado localmente es uno que puede usar solo en el proyecto en el que lo instaló.
Para instalar un paquete localmente, haga lo siguiente:
Nota: Debe tener Node y NPM instalados en su sistema para que funcionen los siguientes comandos de instalación de NPM (e Yarn). Puede obtener ambos instalando el último LTS o la versión actual del sitio web de Node.js.
npm install package-name --save
Tenga en cuenta que el --save
comando anterior indica a NPM que guarde package-name
el package.json
archivo como uno de los paquetes de los que depende el proyecto.
Suponga que desea instalar una versión exacta de un paquete. En tal caso, agregue un @[version-number]
después del nombre del paquete así:
npm install package-name@4.14.1 --save
Alternativamente, si el paquete que está instalando es para fines de desarrollo y prueba, use:
npm install package-name --save-dev
Los comandos anteriores harán que NPM descargue tres elementos en el directorio raíz de su proyecto: una node_modules
carpeta, un package.json
archivo y un package-lock.json
archivo. Discutiremos estos elementos en detalle más adelante en este artículo.
yarn add package-name
Suponga que desea instalar una versión exacta de un paquete. En tal caso, agregue un @[version-number]
después del nombre del paquete así:
yarn add package-name@4.14.1
Alternativamente, si el paquete que está instalando es para fines de desarrollo y prueba, use:
yarn add package-name --dev
Los comandos anteriores harán que Yarn descargue tres elementos en el directorio raíz de su proyecto: una node_modules
carpeta, un package.json
archivo y un yarn.lock
archivo. Discutiremos estos elementos en detalle más adelante en este artículo.
Entonces, ahora que sabemos cómo instalar un paquete localmente, podemos analizar la instalación del paquete global.
Un paquete instalado globalmente es un paquete que puede usar en cualquier parte de su sistema.
Para instalar un paquete globalmente, ejecute el siguiente código en su terminal:
npm install package-name -g
Alternativamente, puedes usar Yarn así:
yarn global add package-name
Tenga en cuenta que puede ejecutar los comandos anteriores desde cualquier ubicación de su sistema.
Generalmente, es mejor instalar un paquete localmente. A continuación se muestran algunas de las diferencias entre una instalación local y una global.
Un paquete instalado localmente se instala en el directorio donde ejecutó el comando npm install package-name
(o ).yarn add package-name
Específicamente, encontrará los paquetes instalados localmente de un proyecto en su node_module
directorio.
Por el contrario, un paquete instalado globalmente se instala en una sola ubicación en su sistema. La ubicación exacta depende de la configuración de su sistema.
Supongamos que instaló su paquete localmente. Luego, puede usar diferentes versiones del mismo paquete para el desarrollo de múltiples aplicaciones.
Sin embargo, se ve obligado a usar la misma versión del paquete para todas sus aplicaciones cuando las instala globalmente.
Una instalación local le permite elegir los paquetes del proyecto que desea actualizar a la última versión. Esto facilita la gestión de actualizaciones que rompen la compatibilidad con otros paquetes.
Sin embargo, actualizar un paquete instalado globalmente actualiza el paquete para todos los proyectos, lo que puede causar pesadillas de mantenimiento si la actualización rompe la compatibilidad con otros paquetes.
La instalación global es mejor para los paquetes que pretende usar solo en su línea de comandos, especialmente cuando proporcionan comandos ejecutables reutilizables en todos los proyectos.
Sin embargo, la instalación local es mejor para los paquetes que pretende usar en su programa, a través de la import
instrucción o la require()
función.
NPM , React Native CLI , Gatsby CLI , Grunt CLI y Vue CLI son ejemplos bien conocidos de paquetes globales.
Los ejemplos comunes de paquetes locales son Webpack , Lodash , Jest y MomentJS .
Nota:
node_modules
directorio. Y si hubiera especificado el --save
comando, su gerente agregaría detalles sobre el paquete al package.json
archivo.Pero, ¿qué son exactamente la node_modules
carpeta, package.json
el archivo, package-lock.json
el archivo y yarn.lock
el archivo? Vamos a averiguar.
node_modules
carpeta?El directorio node_modules es la carpeta donde NPM coloca todos los paquetes que descarga localmente para su proyecto.
package.json
archivo?Un archivo package.json es un documento JSON que los administradores de paquetes, como NPM e Yarn, usan para almacenar información sobre un proyecto específico.
En otras palabras, un package.json
archivo es un archivo de metadatos de un proyecto.
package.json
archivoun package.json
archivo:
package.json
archivoVaya al directorio raíz de su proyecto e inicie la creación de un package.json
archivo ejecutando:
npm init
O, si su administrador de paquetes es Yarn, ejecute:
yarn init
Una vez que haya ejecutado el comando de inicialización anterior, su administrador de paquetes lo guiará a través de la creación del package.json
archivo haciéndole algunas preguntas sobre su proyecto.
Si desea omitir el cuestionario, puede crear un package.json
archivo predeterminado. Veamos cómo.
package.json
archivo predeterminadoSuponga que prefiere omitir el cuestionario solicitado por el comando npm init
(o ). yarn init
En tal caso, vaya al directorio raíz de su proyecto y ejecute:
npm init -y
O, si su administrador de paquetes es Yarn, ejecute:
yarn init -y
El comando anterior utilizará los valores predeterminados extraídos del directorio actual para crear el package.json
archivo de su proyecto.
Nota: La -y
bandera es una abreviatura de --yes
.
Una vez que su administrador de paquetes termine su proceso de inicialización, el package.json
archivo de su proyecto contendrá un objeto con un conjunto de propiedades.
Aquí hay un ejemplo:
{
"name": "codesweetly-project",
"version": "1.0.0",
"main": "index.js"
}
Puede ver que el package.json
archivo anterior contiene los campos name
, version
y . main
Aprendamos más sobre estas propiedades a continuación.
package.json
campos deLas package.json
propiedades de hacen que su proyecto sea útil para administradores de paquetes y usuarios finales.
Suponga que desea publicar su paquete en el registro de NPM. En ese caso, su package.json
archivo debe tener los campos "name"
y ."version"
Sin embargo, si no tiene la intención de publicar su paquete, en ese caso, todos los campos, incluidas las propiedades "name"
y "version"
, son opcionales.
Aprendamos más sobre los campos de uso común en un package.json
archivo.
El "name"
campo es una propiedad utilizada para registrar el nombre de un proyecto.
El "name"
valor de la propiedad debe ser:
Tenga en cuenta que puede unir palabras con guiones y guiones bajos.
Aquí hay un ejemplo:
{
"name": "code_sweetly-project"
}
El "version"
campo indica el número de versión actual de un proyecto.
La "version"
propiedad debe tener la forma de un major.minor.patch
formato. También debe seguir las pautas de control de versiones semánticas .
Aquí hay un ejemplo:
{
"version": "1.0.0"
}
El "description"
campo es una propiedad que contiene una breve descripción del propósito de un proyecto.
NPM recomienda tener una "description"
propiedad para que su paquete sea más fácil de encontrar en el sitio web de NPM.
Su descripción será una de las cosas que se mostrarán cuando las personas ejecuten el npm search
comando.
Aquí hay un ejemplo:
{
"description": "A brief description about this package (project)"
}
El "main"
campo indica el punto de entrada de un proyecto .
En otras palabras, cuando alguien ejecuta la require()
función, Node resolverá la invocación en require(<package.json:main>)
.
Aquí hay un ejemplo:
{
"main": "./src/index.js"
}
El "private"
campo permite que los administradores de paquetes sepan si deben publicar su proyecto en el registro de NPM.
Aquí hay un ejemplo:
{
"private": true
}
Si establece la "private"
propiedad de su paquete.json en true
, los administradores de paquetes no publicarán su proyecto.
Por lo tanto, configurar la propiedad es una excelente manera de evitar la publicación accidental de su paquete.
El "scripts"
campo define los comandos de script que desea ejecutar en varios momentos del ciclo de vida de su proyecto.
Aquí hay un ejemplo:
{
"scripts": {
"test": "jest",
"dev": "webpack --mode development",
"build": "webpack --mode production",
"predeploy": "npm run build",
"deploy": "gh-pages -d build"
}
}
El "scripts"
campo de arriba contiene cinco propiedades cuyos valores son los comandos que queremos que nuestro administrador de paquetes ejecute cada vez que invoquemos la clave de la propiedad.
Entonces, por ejemplo, ejecutar npm run dev
ejecutará el "webpack --mode development"
comando.
El "keywords"
campo especifica una serie de palabras clave que pueden ayudar a las personas a descubrir su paquete.
Aquí hay un ejemplo:
{
"keywords": [
"drag",
"drop",
"drag and drop",
"dragndrop",
"draggable"
]
}
La "keywords"
propiedad es parte de la información que se muestra cuando las personas ejecutan el npm search
comando.
El "author"
campo enumera los detalles del autor de un proyecto.
Aquí hay un ejemplo:
{
"author": "Oluwatobi Sofela <oluwatobiss@codesweetly.com> (https://www.codesweetly.com)"
}
También puede escribir el fragmento anterior como:
{
"author": {
"name": "Oluwatobi Sofela",
"email": "oluwatobiss@codesweetly.com",
"url": "https://www.codesweetly.com"
}
}
Tenga en cuenta que las propiedades "email"
y "url"
son opcionales.
El "dependencies"
campo enumera todos los paquetes de los que depende un proyecto en producción.
Aquí hay un ejemplo:
{
"dependencies": {
"first-package": "^1.0.4",
"second-package": "~2.1.3"
}
}
Por lo tanto, cada vez que un usuario instala su proyecto desde el registro de NPM, la propiedad de dependencias garantiza que los administradores de paquetes puedan encontrar e instalar automáticamente los paquetes enumerados.
Tenga en cuenta que puede agregar un paquete al "dependencies"
campo a través de cualquiera de las siguientes formas:
npm install package-name --save-prod
comando en su terminal. O yarn add package-name
si Yarn es su administrador de paquetes.El "devDependencies"
campo enumera todos los paquetes que un proyecto no necesita en producción, pero requiere para su desarrollo local y fines de prueba.
Aquí hay un ejemplo:
{
"devDependencies": {
"first-dev-package": "^5.8.1",
"second-dev-package": "3.2.2—4.0.0"
}
}
Tenga en cuenta que los paquetes enumerados en el "devDependencies"
campo estarán disponibles en el entorno de desarrollo del proyecto, pero no en su servidor de producción.
Supongamos que un usuario instala el proyecto mediante el comando npm install
(o ). yarn add
En tal caso, el administrador de paquetes encontrará y descargará todos los listados devDependencies
en el directorio del proyecto node_modules
.
Tenga en cuenta que puede agregar un paquete al "devDependencies"
campo a través de cualquiera de las siguientes formas:
npm install package-name --save-dev
comando en su terminal. O yarn add package-name --dev
si Yarn es su administrador de paquetes.El "homepage"
campo especifica la URL de la página de inicio de su proyecto.
Aquí hay un ejemplo:
{
"homepage": "https://codesweetly.com/package-json-file-explained"
}
Entonces, ahora que sabemos qué package.json
es un archivo, podemos discutir package-lock.json
.
package-lock.json
archivo?El archivo package-lock.json es un documento que NPM usa para registrar la versión exacta de todos los paquetes que ha instalado localmente en el node_modules
directorio de su proyecto.
Un package-lock.json
archivo hace que una aplicación sea 100 % reproducible de la forma exacta en que la publicaste en el registro de NPM.
Entonces, suponga que un usuario clona su aplicación y ejecuta el npm install
comando. En tal caso, package-lock.json
asegura que el usuario descargue la versión exacta de los paquetes que utilizó para desarrollar la aplicación.
Por ejemplo, supongamos que un usuario clonó su aplicación que no contiene ningún package-lock.json
archivo y una dependencia utilizada en la aplicación tiene una versión más nueva.
Supongamos que el número de versión de la dependencia en el package.json
archivo tiene un signo de intercalación (por ejemplo, ^2.6.2
). En ese caso, NPM instalará la versión secundaria más reciente de la dependencia, lo que podría provocar que la aplicación produzca resultados erróneos.
Sin embargo, suponga que el usuario clonó su aplicación que contiene un package-lock.json
archivo. En ese caso, NPM instalará la versión exacta de la dependencia registrada en el package-lock.json
archivo, independientemente de si existe una versión más reciente.
Por lo tanto, los usuarios siempre obtendrán su aplicación de la manera precisa en que la publicó en el registro de NPM.
En otras palabras, NPM usa el package-lock.json
archivo para bloquear las dependencias de su paquete a los números de versión específicos que usó para el desarrollo del proyecto.
Nota: NPM actualizará los paquetes registrados en el package-lock.json
archivo cada vez que ejecute el npm update
comando.
yarn.lock
archivo?El yarn.lock
archivo es un documento que Yarn usa para registrar la versión exacta de todos los paquetes que ha instalado localmente en el node_modules
directorio de su proyecto.
El yarn.lock
archivo es comparable al archivo de bloqueo package-lock.json de NPM .
Anteriormente mencionamos que su administrador de paquetes no ejecuta un paquete instalado; debe hacerlo usted mismo explícitamente. Discutamos cómo.
Hay varias formas de ejecutar un paquete ejecutable. A continuación se muestran las técnicas estándar.
Una forma de ejecutar un paquete ejecutable es escribir su ruta local en la línea de comandos de la siguiente manera:
./node_modules/.bin/package-name
scripts
campo de package.jsonUna forma alternativa de ejecutar un paquete es agregarlo primero al "scripts"
campo del archivo package.json de su proyecto de esta manera:
{
"name": "your_package",
"version": "1.0.0",
"scripts": {
"desired-name": "name-of-package-to-execute"
}
}
Luego, puede ejecutar el paquete así:
npm run desired-name
Tenga en cuenta que el comando anterior es una abreviatura de npm run-script desired-name
.
Alternativamente, puede ejecutar el paquete con Yarn así:
yarn run desired-name
Aquí hay un ejemplo:
{
"name": "codesweetly-app",
"version": "1.0.0",
"scripts": {
"build": "webpack",
}
}
El fragmento anterior agregó un paquete web a su package.json
campo "scripts"
. Entonces, ahora podemos ejecutar webpack
en la línea de comando de esta manera:
npm run build
O, si su administrador de paquetes es Yarn, puede ejecutar un paquete web como este:
yarn run build
Una forma más rápida de ejecutar un paquete ejecutable es usar NPX así:
npx package-name
Con NPX, ya no necesita agregar su paquete al "scripts"
campo del package.json
archivo de su proyecto.
NPX (Node Package Execute) es un ejecutor de paquetes de Node que busca y ejecuta automáticamente un paquete específico.
Aquí hay un ejemplo:
npx webpack
El comando anterior encontrará y ejecutará automáticamente webpack . Por lo tanto, no necesitamos agregar la "build": "webpack"
propiedad al "scripts"
campo de nuestro package.json
archivo.
Nota: NPX se instala automáticamente cuando instala Node 8.2/NPM 5.2.0 o superior.
También puede ejecutar código con su versión preferida de Node.js. Averigüemos cómo.
Puede usar el @
carácter y el paquete node npm para especificar la versión de Node.js que desea usar para ejecutar su código.
Aquí hay un ejemplo:
npx node@7 index.js
El fragmento anterior le dice a NPX que se ejecute index.js
con la última versión de Node desde la versión 7 principal.
Usar el node@
comando es una forma útil de evitar el uso de herramientas de administración de versiones de Node.js como nvm para cambiar entre versiones de Node.
Suponga que desea confirmar la versión de nodo que utilizará NPX para ejecutar su código. En ese caso, ejecuta:
npx node@7 -v
El fragmento anterior mostrará la última versión de Node de la versión 7 principal que NPX usará para ejecutar su código, por ejemplo, v7.10.1
.
Para determinar si alguno de los paquetes de su proyecto está desactualizado, ejecute:
npm outdated
Si el comando no genera nada, significa que todos los paquetes de su proyecto están actualizados.
De lo contrario, consulte este artículo obsoleto de npm para obtener una explicación detallada de la salida del comando.
Alternativamente, puedes usar Yarn así:
yarn outdated
Nota: para verificar el estado desactualizado de un paquete específico, agregue el nombre del paquete después de la outdated
palabra clave, por ejemplo, npm outdated lodash
.
Para confirmar qué paquete global está desactualizado, ejecute:
npm outdated -g --depth=0
Aquí hay tres formas de verificar los paquetes instalados localmente:
npm list
O usa Yarn así:
yarn list
npm list --depth=0
O,
yarn list --depth=0
npm list package-name
Aquí hay tres formas de verificar los paquetes instalados globalmente:
npm list -g
O usa Yarn así:
yarn list -g
npm list -g --depth=0
O,
yarn list -g --depth=0
npm list -g package-name
Aquí se explica cómo actualizar paquetes con NPM e Yarn:
npm update package-name
O, para proyectos administrados con Yarn, ejecute:
yarn upgrade package-name
npm update
O,
yarn upgrade
Puede actualizar un paquete instalado globalmente como este:
npm update package-name -g
npm update -g
Aquí se explica cómo desinstalar paquetes con NPM e Yarn:
Primero, navegue hasta el directorio raíz del proyecto desde la línea de comando y ejecute:
npm uninstall package-name
Nota:
-S
(o --save
) para eliminar las referencias al paquete en el dependencies
campo del package.json
archivo del proyecto.-D
(o --save-dev
) para eliminar las referencias al paquete en el devDependencies
campo del package.json
archivo del proyecto.Para proyectos administrados con Yarn, ejecute:
yarn remove package-name
Nota: El yarn remove
comando actualizará automáticamente los archivos package.json
y el proyecto.yarn.lock
npm uninstall package-name -g
Tenga en cuenta que es una buena práctica no eliminar paquetes manualmente de la node_modules
carpeta, ya que tal acción puede afectar a otros módulos dependiendo de ella.
Pero, ¿qué es exactamente un módulo en NodeJS? Averigüémoslo a continuación.
Un módulo en NodeJS es cualquier archivo en la node_modules
carpeta que la computadora puede cargar a través de la función de Node require()
.
Aquí hay un ejemplo:
const myModule = require("./codesweetly.js");
Suponga que la computadora usó con éxito la require()
función para cargar el codesweetly.js
archivo. En tal caso, significa que codesweetly.js
es un módulo asignado a la myModule
variable.
Tenga en cuenta que un módulo también puede ser un paquete, pero no siempre.
Un módulo no es un paquete si no tiene un package.json
archivo utilizado para registrar información sobre él.
Además, tenga en cuenta que para que la función pueda cargar un módulo require()
, el módulo debe ser uno de los siguientes:
package.json
archivo contiene un "main"
campo.NPM es un registro gratuito para autores de paquetes públicos .
Entonces, puede usarlo para publicar cualquier proyecto (carpeta) desde su computadora que tenga un package.json
archivo.
A continuación se detallan los pasos necesarios para compartir su paquete con el mundo.
Vaya al sitio web de NPM e inicie sesión (o regístrese si aún no tiene una cuenta).
Nota: asegúrese de verificar su correo electrónico después de crear una nueva cuenta. De lo contrario, obtendrá un 403 Forbidden
error al publicar su paquete.
Inicie sesión en su cuenta de NPM desde la línea de comandos de la siguiente manera:
npm login
Nota: Puede usar el npm whoami
comando para verificar si está conectado actualmente.
Vaya al directorio raíz de su proyecto y publíquelo así:
npm publish
Asegúrese de que el nombre de su paquete no exista actualmente en NPM. De lo contrario, obtendrá un error durante la publicación.
Puede usar el npm search
comando (o la barra de búsqueda del sitio web de NPM ) para buscar si el nombre que desea usar ya existe en NPM.
Supongamos que ya se han tomado todos los nombres adecuados para su paquete. En ese caso, NPM le permite publicar su proyecto como un alcance.
En otras palabras, puede publicar su paquete como una subsección de su nombre de usuario. Veamos cómo a continuación.
Abra su package.json
archivo y prefije el nombre de su paquete con su nombre de usuario.
Aquí hay un ejemplo:
{
"name": "@username/package-name",
"version": "1.0.0",
"main": "index.js",
"license": "MIT"
}
La configuración predeterminada de NPM asume que un paquete de nombres con ámbito es un proyecto privado. Por lo tanto, obtendrá un error si usa el npm publish
comando para compartir un paquete de nombre con ámbito.
Por lo tanto, para publicar su paquete como ámbito de su nombre de usuario, agregue la --access=public
bandera al npm publish
comando:
npm publish --access=public
Nota: puede convertir su proyecto en un paquete con ámbito durante el proceso de inicialización utilizando el npm init --scope=username
comando en lugar de npm init
.
Este artículo discutió qué es un administrador de paquetes. También analizamos cómo funcionan dos administradores de paquetes populares (NPM e Yarn).
¡Gracias por leer!
Fuente: https://www.freecodecamp.org/news/javascript-package-manager-npm-and-yarn/
1650088080
Nota del editor : esta publicación se reescribió por completo el 16 de febrero de 2022 para reevaluar el panorama del administrador de paquetes, hacer referencia y comparar nuevas herramientas y espacios de trabajo, analizar la funcionalidad de Corepack y los impactos en el rendimiento, brindar una vista panorámica del uso del administrador de paquetes entre proyectos populares de código abierto y explicar más a fondo la evolución de los gestores de paquetes desde 2010.
Actualmente existen tres jugadores principales en el campo de los administradores de paquetes:
Prácticamente, hemos logrado la paridad de características entre todos los administradores de paquetes, por lo que lo más probable es que decida qué administrador de paquetes usar en función de los requisitos no funcionales, como la velocidad de instalación, el consumo de almacenamiento o cómo se integra con su flujo de trabajo existente.
Por supuesto, la forma en que elija usar cada administrador de paquetes será diferente, pero todos comparten un conjunto de conceptos principales. Puede hacer lo siguiente con cualquiera de estos administradores de paquetes:
Sin embargo, a pesar de esta paridad, los administradores de paquetes difieren bajo el capó. Tradicionalmente, npm e Yarn han instalado dependencias en una node_modules
carpeta plana . Pero esta estrategia de resolución de la dependencia no está exenta de críticas.
Por lo tanto, pnpm ha introducido algunos conceptos nuevos para almacenar dependencias de manera más eficiente en una node_modules
carpeta anidada. Yarn Berry va aún más lejos al abandonar por node_modules
completo su modo Plug'n'Play (PnP).
Siéntase libre de saltar y leer lo que sea más relevante para usted.
Creé una aplicación React complementaria para demostrar algunos de los conceptos únicos de los diferentes administradores de paquetes. Existe una rama Git correspondiente para cada variante del administrador de paquetes. Este es el proyecto que también utilicé para crear la tabla de rendimiento en la sección a continuación de esta publicación.
Aunque el tipo de aplicación no es importante para el tema de este artículo, he elegido un proyecto de tamaño mediano y realista para poder iluminar diferentes aspectos; como ejemplo del pasado reciente, el mecanismo PnP de Yarn Berry provocó algunas discusiones acaloradas sobre problemas de compatibilidad que este proyecto es adecuado para ayudar a examinar.
El primer administrador de paquetes que se lanzó fue npm, en enero de 2010. Estableció los principios básicos de cómo funcionan los administradores de paquetes en la actualidad.
Si npm existe desde hace más de 10 años, ¿por qué existen alternativas? Aquí hay algunas razones clave por las que han surgido:
node_modules
estructuras de carpetas (anidado, plano, node_modules
modo PnP)Profundicemos en una breve historia de cómo se identificaron estas necesidades después de que npm saltó a la fama, cómo Yarn Classic resolvió algunas de ellas, cómo pnpm amplió estos conceptos y cómo Yarn Berry, como sucesor de Yarn Classic, trató de romper el molde. por estos conceptos y procesos tradicionales.
npm es el antepasado de los administradores de paquetes. Por error, mucha gente cree que npm es un acrónimo de “Node package manager”, pero no es así . Sin embargo, se incluye con el tiempo de ejecución de Node.js.
Su lanzamiento supuso una revolución porque, hasta entonces, las dependencias de los proyectos se descargaban y gestionaban de forma manual. Conceptos como el package.json
archivo con sus campos de metadatos (p. ej., devDependencies
), el almacenamiento de dependencias en node_modules
, scripts personalizados, registros de paquetes públicos y privados, y más, fueron introducidos por npm.
En 2020, GitHub adquirió npm , por lo que, en principio, npm ahora está bajo la administración de Microsoft. Al momento de escribir este artículo, la versión principal más reciente es v8 , lanzada en octubre de 2021.
En una publicación de blog de octubre de 2016 , Facebook anunció un esfuerzo de colaboración con Google y algunos otros para desarrollar un nuevo administrador de paquetes que resolvería los problemas de consistencia, seguridad y rendimiento que npm tenía en ese momento. Llamaron a la alternativa Yarn , que significa Otro Negociador de Recursos.
Aunque basaron el diseño arquitectónico de Yarn en muchos conceptos y procesos establecidos por npm, Yarn tuvo un gran impacto en el panorama del administrador de paquetes en su versión inicial. A diferencia de npm, Yarn paralelizó las operaciones para acelerar el proceso de instalación, que había sido un gran problema para las primeras versiones de npm.
Yarn puso el listón más alto en DX, seguridad y rendimiento, y también inventó muchos conceptos, entre ellos:
Yarn v1 entró en modo de mantenimiento en 2020 . Desde entonces, la línea v1.x se ha considerado heredada y se le cambió el nombre a Yarn Classic. Su sucesor, Yarn v2 o Berry, es ahora la rama de desarrollo activa.
La versión 1 de pnpm fue lanzada en 2017 por Zoltan Kochan. Es un reemplazo directo para npm, por lo que si tiene un proyecto npm, ¡puede usar pnpm de inmediato!
El principal problema que tenían los creadores de pnpm con npm e Yarn era el almacenamiento redundante de dependencias que se usaban en todos los proyectos. Aunque Yarn Classic tenía ventajas de velocidad sobre npm, usaba el mismo enfoque de resolución de dependencias, lo cual era imposible para los creadores de pnpm: npm y Yarn Classic usaban elevación para aplanar su node_modules
.
En lugar de izar, pnpm introdujo una estrategia alternativa de resolución de dependencias: almacenamiento direccionable por contenido . Este método da como resultado una node_modules
carpeta anidada que almacena paquetes en un almacén global en su carpeta de inicio ( ~/.pnpm-store/
). Cada versión de una dependencia se almacena físicamente en esa carpeta solo una vez, lo que constituye una única fuente de verdad y ahorra bastante espacio en disco.
Esto se logra a través de un node_modules
diseño, utilizando enlaces simbólicos para crear una estructura anidada de dependencias, donde cada archivo de cada paquete dentro de la carpeta es un enlace fijo a la tienda. El siguiente diagrama de la documentación oficial aclara esto.
Fuente: pnpm
La influencia de pnpm se puede ver en su informe de 2021 : los competidores quieren adoptar los conceptos de instalación de pnpm, como la estructura de enlaces simbólicosnode_modules
y la gestión eficiente del disco de los paquetes debido a sus innovaciones en el almacenamiento direccionable por contenido .
Yarn 2 se lanzó en enero de 2020 y se anunció como una actualización importante del Yarn original. El equipo de Yarn comenzó a referirse a él como Yarn Berry para que fuera más obvio que era esencialmente un nuevo administrador de paquetes con una nueva base de código y nuevos principios.
La principal innovación de Yarn Berry es su enfoque Plug'n'Play (PnP) , que surgió como una estrategia para corregirnode_modules
. En lugar de generar node_modules
, se genera un .pnp.cjs
archivo con tablas de búsqueda de dependencias, que se puede procesar de manera más eficiente porque es un archivo único en lugar de una estructura de carpetas anidadas. Además, cada paquete se almacena como un archivo zip dentro de la .yarn/cache/
carpeta, lo que ocupa menos espacio en disco que la node_modules
carpeta.
Todo este cambio, y tan rápido, generó una gran controversia después del lanzamiento. Los cambios importantes de PnP requirieron que los mantenedores actualizaran sus paquetes existentes para ser compatibles con él. El nuevo enfoque PnP se usó de forma predeterminada, y volver al node_modules
principio no fue sencillo, lo que llevó a muchos desarrolladores destacados a criticar abiertamente a Yarn 2 por no habilitarlo.
Desde entonces, el equipo de Yarn Berry ha abordado muchos problemas en sus versiones posteriores. Para abordar la incompatibilidad de PnP, el equipo ofreció algunas formas de cambiar fácilmente el modo de operación predeterminado. Con la ayuda de un node_modules
complemento , solo se necesitaba una línea de configuración para usar el node_modules
enfoque tradicional.
Además, el ecosistema de JavaScript ha brindado más y más soporte para PnP a lo largo del tiempo, como puede ver en esta tabla de compatibilidad , y algunos grandes proyectos se han movido para adoptar Yarn Berry. En mi proyecto complementario , también pude implementar correctamente PnP con mi proyecto de demostración React.
Aunque Yarn Berry es bastante joven, también tiene un impacto en el panorama de los administradores de paquetes: pnpm adoptó un enfoque PnP a fines de 2020.
Primero se debe instalar un administrador de paquetes en los sistemas locales y de CI/CD de cada desarrollador.
npm se envía con Node.js, por lo que no se necesita ningún paso adicional. Además de descargar el instalador de Node.js para su sistema operativo, se ha vuelto una práctica común usar herramientas CLI para administrar versiones de software. En el contexto de Node, Node Version Manager (nvm) o Volta se han convertido en utilidades muy útiles.
Puede instalar Yarn 1 de diferentes maneras, por ejemplo, como un paquete npm con $ npm i -g yarn
.
Para migrar de Yarn Classic a Yarn Berry , la forma recomendada es:
yarn set version
comando para actualizar a la última versión moderna:$ yarn set version berry
Sin embargo, la forma recomendada de instalar Yarn Berry es a través de Corepack.
Corepack fue creado por la gente de Yarn Berry. La iniciativa se llamó originalmente administrador de paquetes (pmm) 🤯 y se fusionó con Node en LTS v16.
Con la ayuda de Corepack, no tiene que instalar los administradores de paquetes alternativos de npm "por separado" porque Node incluye binarios Yarn Classic, Yarn Berry y pnpm como correcciones. Estas correcciones permiten a los usuarios ejecutar comandos Yarn y pnpm sin tener que instalarlos explícitamente primero y sin saturar la distribución de Node.
Corepack viene preinstalado con Node.js ≥ v16.9.0. Sin embargo, para versiones anteriores de Node, puede instalarlo usando $ npm install -g corepack
.
Habilite Corepack primero, antes de usarlo. El ejemplo muestra cómo activarlo en Yarn Berry v3.1.1.
# you need to opt-in first
$ corepack enable
# shim installed but concrete version needs to activated
$ corepack prepare yarn@3.1.1 --activate
Puede instalar pnpm como un paquete npm con $ npm i -g pnpm
. También puede instalar pnpm con Corepack : $ corepack prepare pnpm@6.24.2 --activate
.
En esta sección verás de un vistazo las principales características de los diferentes gestores de paquetes. Puede detectar fácilmente qué archivos están involucrados en la configuración de administradores de paquetes particulares y qué archivos se generan en un paso de instalación.
Todos los administradores de paquetes almacenan toda la metainformación importante en el archivo de manifiesto del proyecto, package.json
. Además, se puede usar un archivo de configuración en el nivel raíz para configurar registros privados o métodos de resolución de dependencias.
Con un paso de instalación, las dependencias se almacenan en una estructura de archivos (por ejemplo, dentro de node_modules
) y se genera un archivo de bloqueo. Esta sección no tiene en cuenta la configuración de espacios de trabajo , por lo que todos los ejemplos solo muestran una única ubicación donde se almacenan las dependencias.
Con $ npm install
, o el más corto $ npm i
, se generan un package-lock.json
archivo y una carpeta. Se puede colocar un archivo de configuraciónnode_modules
opcional en el nivel raíz. Consulte la siguiente sección para obtener más información sobre los archivos de bloqueo..npmrc
.
├── node_modules/
├── .npmrc
├── package-lock.json
└── package.json
Ejecutar $ yarn
crea un yarn.lock
archivo y una node_modules
carpeta. Un .yarnrc
archivo también puede ser una opción de configuración; Yarn Classic también hace honor a los .npmrc
archivos. Opcionalmente, se puede usar una carpeta de caché ( .yarn/cache/
) y una ubicación que almacene la versión actual de Yarn Classic ( .yarn/releases/
). Las diferentes formas de configurar esto se pueden ver en la sección de comparación de configuraciones.
.
├── .yarn/
│ ├── cache/
│ └── releases/
│ └── yarn-1.22.17.cjs
├── node_modules/
├── .yarnrc
├── package.json
└── yarn.lock
node_modules
Independientemente del modo de instalación, tendrá que manejar más archivos y carpetas en los proyectos de Yarn Berry que en los proyectos que usan otros administradores de paquetes. Algunos son opcionales y otros son obligatorios.
Yarn Berry ya no honra .npmrc
ni .yarnrc
archiva; en su lugar, se requiere un .yarnrc.yml
archivo de configuración . Para un flujo de trabajo tradicional con una node_modules
carpeta generada, debe proporcionar una nodeLinker
configuración que use una node_modules
variante de instalación inspirada en pnpm.
# .yarnrc.yml
nodeLinker: node-modules # or pnpm
La ejecución $ yarn
instala todas las dependencias en una node_modules
carpeta. Se yarn.lock
genera un archivo más nuevo pero incompatible con Yarn Classic. Además, .yarn/cache/
se genera una carpeta que se usa para instalaciones sin conexión. La releases
carpeta es opcional y almacena la versión de Yarn Berry que usa el proyecto, como veremos en la sección de comparación de configuraciones.
.
├── .yarn/
│ ├── cache/
│ └── releases/
│ └── yarn-3.1.1.cjs
├── node_modules/
├── .yarnrc.yml
├── package.json
└── yarn.lock
Tanto para los modos PnP estrictos como flexibles$ yarn
, la ejecución genera .yarn/cache/
y .yarn/unplugged/
, junto con .pnp.cjs
y yarn.lock
archivos. PnP estricto es el modo predeterminado, pero para suelto, se requiere una configuración.
# .yarnrc.yml
nodeLinker: pnp
pnpMode: loose
En un proyecto PnP, .yarn/
lo más probable es que la carpeta contenga una sdk/
carpeta para proporcionar compatibilidad con IDE además de una releases/
carpeta. Hay incluso más carpetas que pueden formar parte de .yarn/
, según su caso de uso.
.
├── .yarn/
│ ├── cache/
│ ├── releases/
│ │ └── yarn-3.1.1.cjs
│ ├── sdk/
│ └── unplugged/
├── .pnp.cjs
├── .pnp.loader.mjs
├── .yarnrc.yml
├── package.json
└── yarn.lock
El estado inicial de un proyecto pnpm se parece a un proyecto npm o Yarn Classic: necesita un package.json
archivo. Después de instalar las dependencias con , se genera $ pnpm i
una carpeta, pero su estructura es completamente diferente debido a su enfoque de almacenamiento direccionable por contenido.node_modules
pnpm también genera su propia versión de un archivo de bloqueo, pnp-lock.yml
. Puede proporcionar una configuración adicional con un .npmrc
archivo opcional.
.
├── node_modules/
│ └── .pnpm/
├── .npmrc
├── package.json
└── pnpm-lock.yml
Como se describe en la sección anterior, cada administrador de paquetes crea archivos de bloqueo .
Los archivos de bloqueo almacenan exactamente las versiones de cada dependencia instalada para su proyecto, lo que permite instalaciones más predecibles y deterministas. Esto es necesario porque las versiones de dependencia probablemente se declaran con rangos de versión (p. ej., ≥ v1.2.5) y, por lo tanto, las versiones realmente instaladas podrían diferir si no "bloquea" sus versiones.
Los archivos de bloqueo a veces también almacenan sumas de verificación, que trataremos con más detalle en nuestra sección sobre seguridad.
Los archivos de bloqueo han sido una característica de npm desde v5 ( package-lock.json
), en pnpm desde el primer día ( pnpm-lock.yaml
) y en un nuevo formato YAML en Yarn Berry ( yarn.lock
).
En la sección anterior, vimos el enfoque tradicional, donde las dependencias se instalan en una node_modules
estructura de carpetas. Este es el esquema que utilizan npm, Yarn Classic y pnpm , donde pnpm lo hace de manera más eficiente que los demás.
Yarn Berry en modo PnP lo hace de manera diferente. En lugar de una node_modules
carpeta, las dependencias se almacenan como archivos zip en combinación con un archivo .yarn/cache/
y ..pnp.cjs
Es mejor tener estos archivos bloqueados bajo el control de versiones porque resuelve el problema "funciona en mi máquina": todos los miembros del equipo instalan las mismas versiones.
Las siguientes tablas comparan un conjunto seleccionado de diferentes comandos CLI disponibles en npm, Yarn Classic, Yarn Berry y pnpm. Esta no es una lista completa, pero constituye una hoja de trucos. Esta sección no cubre los comandos relacionados con el espacio de trabajo.
npm y pnpm presentan especialmente muchos alias de comandos y opciones, lo que significa que los comandos pueden tener diferentes nombres, es decir, $ npm install
es lo mismo que $ npm add
. Además, muchas opciones de comandos tienen versiones cortas, por ejemplo, -D
en lugar de --save-dev
.
En las tablas, me referiré a todas las versiones cortas como alias. Con todos los administradores de paquetes, puede agregar, actualizar o eliminar varias dependencias separándolas con espacios (p. ej., npm update react react-dom
). En aras de la claridad, los ejemplos solo muestran el uso con dependencias individuales.
Esta tabla cubre los comandos de administración de dependencias para instalar o actualizar todas las dependencias especificadas en package.json
, o múltiples dependencias especificándolas en los comandos.
Acción | sobre el nivel del mar | Hilo clásico | Baya de hilo | pnpm |
---|---|---|---|---|
instalar deps enpackage.json | npm install alias: i ,add | yarn install oyarn | como clásico | pnpm install alias: i |
actualizar deps en package.json acc. sever | npm update alias: up ,upgrade | yarn upgrade | yarn semver up (a través del complemento ) | pnpm update alias: up |
actualizar las dependencias package.json a la última | N / A | yarn upgrade --latest | yarn up | pnpm update --latest alias: -L |
actualizar deps acc. sever | npm update react | yarn upgrade react | yarn semver up react | pnpm up react |
actualizar deps a la última | npm update react@latest | yarn upgrade react --latest | yarn up react | pnpm up -L react |
actualizar deps de forma interactiva | N / A | yarn upgrade-interactive | yarn upgrade-interactive (a través del complemento ) | $ pnpm up --interactive alias: -i |
agregar dependencias de tiempo de ejecución | npm i react | yarn add react | como clásico | pnpm add react |
añadir departamentos de desarrollo | npm i -D babel alias: --save-dev | yarn add -D babel alias: --dev | como clásico | pnpm add -D babel alias: --save-dev |
agregar deps a package.json sin semver | npm i -E react alias: --save-exact | yarn add -E react alias: --exact | como clásico | pnpm add -E react alias: --save-exact |
desinstalar deps y eliminar depackage.json | npm uninstall react alias: remove , rm , r , un ,unlink | yarn remove react | como clásico | pnpm remove react alias: rm , un ,uninstall |
desinstalar deps sin actualización depackage.json | npm uninstall --no-save | N / A | N / A | N / A |
Los siguientes ejemplos muestran cómo administrar paquetes que constituyen herramientas de utilidad durante el tiempo de desarrollo, también conocidos como archivos binarios, como ntl , para ejecutar secuencias de comandos de forma interactiva. La terminología utilizada en la tabla:
node_modules/.bin/
o .yarn/cache/
(PnP)Es importante comprender que Yarn Berry solo nos permite ejecutar archivos binarios que hemos especificado en nuestro campo package.json
o que están expuestos en su bin
metacampo por razones de seguridad. pnpm presenta el mismo comportamiento de seguridad .
Acción | sobre el nivel del mar | Hilo clásico | Baya de hilo | pnpm |
---|---|---|---|---|
instalar paquetes globalmente | npm i -g ntl alias: --global | yarn global add ntl | N/A ( global eliminado ) | pnpm add --global ntl |
actualizar paquetes globalmente | npm update -g ntl | yarn global upgrade ntl | N / A | pnpm update --global ntl |
eliminar paquetes globalmente | npm uninstall -g ntl | yarn global remove ntl | N / A | pnpm remove --global ntl |
ejecutar binarios desde la terminal | npm exec ntl | yarn ntl | yarn ntl | pnpm ntl |
ejecutar binarios desde el script | ntl | ntl | ntl | ntl |
ejecución de paquetes dinámicos | npx ntl | N / A | yarn dlx ntl | pnpm dlx ntl |
agregar dependencias de tiempo de ejecución | npm i react | yarn add react | como clásico | pnpm add react |
añadir departamentos de desarrollo | npm i -D babel alias: --save-dev | yarn add -D babel alias: --dev | como clásico | pnpm add -D babel alias: --save-dev |
agregar deps a package.json sin semver | npm i -E react alias: --save-exact | yarn add -E react alias: --exact | como clásico | pnpm add -E react alias: --save-exact |
desinstalar deps y eliminar depackage.json | npm uninstall react alias: remove , rm , r , un ,unlink | yarn remove react | como clásico | pnpm remove react alias: rm , un ,uninstall |
desinstalar deps sin actualización depackage.json | npm uninstall --no-save | N / A | N / A | N / A |
Esta tabla cubre útiles comandos incorporados. Si no hay un comando oficial, a menudo se puede usar un comando de terceros, a través de un paquete npm o un complemento de Yarn Berry.
Acción | sobre el nivel del mar | Hilo clásico | Baya de hilo | pnpm |
---|---|---|---|---|
publicar paquete | npm publish | yarn publish | yarn npm publish | pnpm publish |
lista de unidades instaladas | npm ls alias: list , la ,ll | yarn list | pnpm list alias: ls | |
lista de dependencias obsoletas | npm outdated | yarn outdated | yarn upgrade-interactive | pnpm outdated |
imprimir información sobre deps | npm explain ntl alias: why | yarn why ntl | como clásico | pnpm why ntl |
proyecto de inicio | npm init -y npm init (interactivo)alias: --yes | yarn init -y yarn init (interactivo)alias: --yes | yarn init | pnpm init -y pnpm init (interactivo)alias: --yes |
imprimir información de licencias | N/A (a través de un paquete de terceros) | yarn licenses list | N/A (o a través de un complemento , otro complemento ) | N/A (a través de un paquete de terceros) |
actualizar la versión del administrador de paquetes | N/A (con herramientas de terceros, por ejemplo, nvm) | con npm:yarn policies set-version 1.13.0 | con paquete básico:yarn set version 3.1.1 | N/A (con npm, Corepack) |
realizar auditoria de seguridad | npm audit | yarn audit | yarn npm audit | pnpm audit |
agregar deps a package.json sin semver | npm i -E react alias: --save-exact | yarn add -E react alias: --exact | como clásico | pnpm add -E react alias: --save-exact |
desinstalar deps y eliminar depackage.json | npm uninstall react alias: remove , rm , r , un ,unlink | yarn remove react | como clásico | pnpm remove react alias: rm , un ,uninstall |
desinstalar deps sin actualización depackage.json | npm uninstall --no-save | N / A | N / A | N / A |
La configuración de los administradores de paquetes se lleva a cabo tanto en sus package.json
archivos de configuración como en los dedicados. Ejemplos de opciones de configuración son:
La mayor parte de la configuración tiene lugar en un archivo de configuración dedicado ( .npmrc
).
Si desea utilizar la función de espacios de trabajo de npm, debe agregar una configuración package.json
mediante el campo de metadatos de espacios de trabajo para indicarle a npm dónde encontrar las carpetas que constituyen subproyectos o espacios de trabajo, respectivamente.
{
// ...
"workspaces": [
"hooks",
"utils"
]
}
Cada administrador de paquetes funciona de manera inmediata con el registro público de npm. En el contexto de una empresa con bibliotecas compartidas, lo más probable es que desee reutilizarlas sin publicarlas en un registro público. Para configurar un registro privado, puede hacerlo en un .npmrc
archivo.
# .npmrc
@doppelmutzi:registry=https://gitlab.doppelmutzi.com/api/v4/projects/41/packages/npm/
Existen muchas opciones de configuración para npm y se ven mejor en los documentos.
Puede configurar espacios de trabajo de Yarn en su archivo package.json
. Es similar a npm, pero el espacio de trabajo debe ser un paquete privado.
{
// ...
"private": true,
"workspaces": ["workspace-a", "workspace-b"]
}
Cualquier configuración opcional va a un .yarnrc
archivo . Una opción de configuración común es establecer un yarn-path
, que impone una versión binaria particular para que la use cada miembro del equipo. El yarn-path
dirige a una carpeta (p. ej., .yarn/releases/
) que contiene una versión particular de Yarn. Puede instalar una versión de Yarn Classic con el yarn policies
comando .
La configuración de espacios de trabajo en Yarn Berry también es análoga a cómo se hace en Yarn Classic, con un archivo package.json
. La mayor parte de la configuración de Yarn Berry tiene lugar en .yarnrc.yml
, y hay muchas opciones de configuración disponibles. El ejemplo de Yarn Classic también es posible, pero el campo de metadatos se renombra a yarnPath
.
# .yarnrc.yml
yarnPath: .yarn/releases/yarn-3.1.1.cjs
Yarn Berry se puede ampliar con complementos mediante el uso de yarn plugin import
. Este comando actualiza el .yarnrc.yml
.
# .yarnrc.yml
plugins:
- path: .yarn/plugins/@yarnpkg/plugin-semver-up.cjs
spec: "https://raw.githubusercontent.com/tophat/yarn-plugin-semver-up/master/bundles/%40yarnpkg/plugin-semver-up.js"
Como se describe en la sección de historial, puede haber problemas con las dependencias en el modo estricto PnP debido a la incompatibilidad. Existe una solución típica para un problema PnP de este tipo: la packageExtensions
propiedad de configuración . Puede seguir el siguiente ejemplo con el proyecto complementario .
# .yarnrc.yml
packageExtensions:
"styled-components@*":
dependencies:
react-is: "*"
pnpm usa el mismo mecanismo de configuración que npm , por lo que puede usar un .npmrc
archivo. La configuración de un registro privado también funciona de la misma manera que con npm.
Con la característica de espacios de trabajo de pnpm , está disponible el soporte para proyectos de paquetes múltiples. Para inicializar un monorepo, debe especificar la ubicación de los paquetes en un pnpm-workspace.yaml
archivo.
# pnpm-workspace.yaml
packages:
- 'packages/**'
Un monorepo es un repositorio que alberga múltiples proyectos, que se denominan espacios de trabajo o paquetes. Es una estrategia de organización de proyectos para mantener todo en un solo lugar en lugar de usar múltiples repositorios.
Por supuesto, esto viene con una complejidad adicional. Yarn Classic fue el primero en habilitar esta funcionalidad, pero ahora todos los principales administradores de paquetes ofrecen una función de espacios de trabajo. Esta sección muestra cómo configurar espacios de trabajo con cada uno de los diferentes administradores de paquetes.
El equipo de npm lanzó la tan esperada función de espacios de trabajo de npm en v7. Contenía una serie de comandos CLI que ayudaron a administrar proyectos de paquetes múltiples desde un paquete raíz. La mayoría de los comandos se pueden usar con opciones relacionadas con el espacio de trabajo para decirle a npm si debe ejecutarse en un espacio de trabajo específico, en varios o en todos.
# Installing all dependencies for all workspaces
$ npm i --workspaces.
# run against one package
$ npm run test --workspace=hooks
# run against multiple packages
$ npm run test --workspace=hooks --workspace=utils
# run against all
$ npm run test --workspaces
# ignore all packages missing test
$ npm run test --workspaces --if-present
A diferencia de otros administradores de paquetes, npm v8 actualmente no admite el filtrado avanzado ni la ejecución de varios comandos relacionados con el espacio de trabajo en paralelo.
En agosto de 2017, el equipo de Yarn anunció soporte monorepo de primera clase en términos de una función de espacios de trabajo . Antes de este punto, solo era posible usar un administrador de paquetes en un proyecto de paquetes múltiples con software de terceros como Lerna . Esta adición a Yarn allanó el camino para que otros administradores de paquetes también implementaran dicha función.
También he escrito anteriormente sobre cómo usar la función de espacios de trabajo de Yarn Classic con y sin Lerna, si está interesado. Pero esta publicación solo cubrirá algunos comandos necesarios para ayudarlo a administrar las dependencias en una configuración de espacios de trabajo de Yarn Classic.
# Installing all dependencies for all workspaces
$ yarn
# display dependency tree
$ yarn workspaces info
# run start command only for one package
$ yarn workspace awesome-package start
# add Webpack to package
$ yarn workspace awesome-package add -D webpack
# add React to all packages
$ yarn add react -W
Yarn Berry presentó espacios de trabajo desde el principio porque su implementación se basó en los conceptos de Yarn Classic. En un comentario de Reddit , un desarrollador principal de Yarn Berry dio una breve descripción general de las funciones orientadas al espacio de trabajo, que incluyen:
$ yarn add --interactive
: permite reutilizar versiones de otros espacios de trabajo al instalar un paquete$ yarn up
: actualiza un paquete en todos los espacios de trabajo$ yarn workspaces focus
: instala dependencias solo para un único espacio de trabajo$ yarn workspaces foreach
: ejecuta un comando en todos los espacios de trabajoYarn Berry hace un uso intensivo de los protocolos , que se pueden usar en los campos dependencies
o de los archivos. Uno de ellos es el protocolo .devDependenciespackage.json
workspace:
A diferencia de los espacios de trabajo de Yarn Classic, Yarn Berry define explícitamente que una dependencia debe ser uno de los paquetes de este monorrepositorio. De lo contrario, Yarn Berry podría intentar obtener una versión de un registro remoto si las versiones no coinciden.
{
// ...
"dependencies": {
"@doppelmutzi/hooks": "workspace:*",
"http-server": "14.0.0",
// ...
}
}
Con su workspace:
protocolo, pnpm facilita proyectos monorepo de manera similar a Yarn Berry. Muchos comandos pnpm aceptan opciones como --recursive
( -r
) o --filter
que son especialmente útiles en un contexto monorepo. Su comando de filtrado nativo también es un buen complemento o reemplazo para Lerna.
# prune all workspaces
pnpm -r exec -- rm -rf node_modules && rm pnpm-lock.yaml
# run all tests for all workspaces with scope @doppelmutzi
pnpm recursive run test --filter @doppelmutzi/
El rendimiento es una parte crucial de la toma de decisiones. Esta sección muestra mis puntos de referencia basados en un proyecto pequeño y uno mediano. Aquí hay algunas notas sobre los proyectos de muestra:
Realicé mediciones para tres casos de uso (UC), una vez para cada una de nuestras variantes de administrador de paquetes. Para conocer la evaluación detallada con explicaciones, echa un vistazo a los resultados del proyecto 1 (P1) y del proyecto 2 (P2) .
node_modules
o.pnp.cjs
node_modules
o.pnp.cjs
node_modules
o.pnp.cjs
Usé la herramienta gnomon para medir el tiempo que consume una instalación (por ejemplo, $ yarn | gnomon
). Además, medí los tamaños de los archivos generados, por ejemplo, $ du -sh node_modules
.
Con mis proyectos y mis medidas, Yarn Berry PnP strict fue el ganador en términos de velocidad de instalación para todos los casos de uso y ambos proyectos.
Resultados de desempeño para el Proyecto 1 | |||||||
---|---|---|---|---|---|---|---|
Método | npm v8.1.2 | Hilo clásico v1.23.0 | pnpm v6.24.4 | Hilo Berry PnP suelto v3.1.1 | Hilo Berry PnP estricto v3.1.1 | Baya de hilo node_modules v3.1.1 | Hilo Berry pnpm v3.1.1 |
CU 1 | 86.63s | 108.89s | 43.58s | 31.77s | 30.13 s | 56.64s | 60.91s |
CU 2 | 41.54s | 65.49s | 26.43 s | 12.46s | 12,66 s | 46.36s | 40.74s |
CU 3 | 23.59s | 40.35s | 20.32s | 1,61 s | 1,36 s | 28.72s | 31.89s |
archivos y tamaño | package-lock.json : 1.3Mnode_modules : 467M | node_modules : 397Myarn.lock : 504K | pnpm-lock.yaml : 412Knode_modules : 319M | yarn.lock : 540Kcaché: 68M desenchufado: 29M .pnp.cjs : 1,6M | yarn.lock : 540Kcaché: 68M desenchufado: 29M .pnp.cjs : 1,5M | node_modules : 395Myarn.lock : 540Kcaché: 68M | node_modules : 374Myarn.lock : 540Kcaché: 68M |
Resultados de desempeño para el Proyecto 2 | |||||||
---|---|---|---|---|---|---|---|
Método | npm v8.1.2 | Hilo clásico v1.23.0 | pnpm v6.24.4 | Hilo Berry PnP suelto v3.1.1 | Hilo Berry PnP estricto v3.1.1 | Baya de hilo node_modules v3.1.1 | Hilo Berry pnpm v3.1.1 |
CU 1 | 34.91s | 43.26s | 15,6 s | 13.92s | 6.44s | 23.62s | 20.09s |
CU 2 | 7.92s | 33.65s | 8.86s | 7.09s | 5,63 s | 15.12 s | 14.93 s |
CU 3 | 5.09s | 15.64 s | 4,73 s | 0,93 s | 0,79 s | 8.18 s | 6.02s |
archivos y tamaño | package-lock.json : 684Knode_modules : 151M | yarn.lock : 268Knode_modules : 159M | pnpm-lock.yaml : 212Knode_modules : 141M | .pnp.cjs : 1.1M :.pnp.loader.mjs 8.0Kyarn.lock : 292K.yarn : 38M | .pnp.cjs : 1.0M.pnp.loader.mjs : 8.0Kyarn.lock : 292K.yarn : 38M | yarn.lock : 292Knode_modules : 164Mcaché: 34M | yarn.lock : 292Knode_modules : 156Mcaché: 34M |
Estos son los puntos de referencia oficiales del equipo de Yarn Berry y de pnpm .
npm ha sido demasiado indulgente cuando se trata de trabajar con paquetes defectuosos y ha experimentado algunas vulnerabilidades de seguridad que afectaron directamente a muchos proyectos. Por ejemplo, en la versión 5.7.0, cuando ejecutaba el sudo npm
comando en un sistema operativo Linux, era posible cambiar la propiedad de los archivos del sistema, lo que hacía que el sistema operativo quedara inutilizable.
Otro incidente ocurrió en 2018 e involucró el robo de Bitcoin. Básicamente, el popular paquete EventStream de Node.js agregó una dependencia maliciosa en su versión 3.3.6. Este paquete malicioso contenía una carga útil encriptada que intentaba robar Bitcoin de la máquina del desarrollador.
Para ayudar a resolver estos problemas, las versiones más recientes de npm utilizan el SHA-512
algoritmo de criptografía package-lock.json
para verificar la integridad de los paquetes que instala.
En general, npm ha hecho cada vez más para cerrar sus brechas de seguridad, especialmente aquellas que se hicieron más obvias en comparación con Yarn.
Tanto Yarn Classic como Yarn Berry han verificado la integridad de cada paquete con sumas de verificación almacenadas yarn.lock
desde el principio. Yarn también intenta evitar que recuperes paquetes maliciosos que no están declarados en tu package.json
durante la instalación: si se encuentra una discrepancia, la instalación se cancela.
Yarn Berry en modo PnP no sufre los problemas de seguridad del node_modules
enfoque tradicional. A diferencia de Yarn Classic, Yarn Berry mejora la seguridad de la ejecución de comandos. Solo puede ejecutar binarios de dependencias que haya declarado explícitamente en su archivo package.json
. Esta función de seguridad es similar a pnpm, que describiré a continuación.
pnpm también usa sumas de verificación para verificar la integridad de cada paquete instalado antes de que se ejecute su código.
Como mencionamos anteriormente, npm y Yarn Classic tienen problemas de seguridad debido a la elevación . pnpm evita esto porque su modelo no usa elevación; en su lugar, genera node_modules
carpetas anidadas que eliminan el riesgo de acceso de dependencia ilegal. Esto significa que las dependencias solo pueden acceder a otras dependencias si se declaran explícitamente en package.json
.
Esto es especialmente crucial en una configuración monorepo, como comentamos, porque el algoritmo de elevación a veces puede conducir a dependencias fantasma y doppelgangers .
Analicé muchos proyectos populares de código abierto para tener una idea de qué administradores de paquetes usa hoy en día la "élite de desarrolladores". Era importante para mí que estos proyectos se mantuvieran activamente y se actualizaran por última vez recientemente. Esto podría darle otra perspectiva al elegir un administrador de paquetes.
sobre el nivel del mar | Hilo clásico | Baya de hilo | pnpm |
---|---|---|---|
Esbelto | Reaccionar | es (con node_modules ) | Ver 3 |
Preactuar | Angular | Libro de cuentos (con node_modules ) | lista de navegadores |
Express.js | Humano | Babel (con node_modules ) | Prisma |
Meteorito | Siguiente.js | Kit de herramientas Redux (con node_modules ) | SvelteKit |
Servidor Apolo | gatsby | ||
Siguiente | |||
Crear aplicación de reacción | |||
webpack-cli | |||
Emoción |
Curiosamente, en el momento de escribir este artículo, ninguno de estos proyectos de código abierto utiliza un enfoque PnP.
El estado actual de los administradores de paquetes es excelente. Prácticamente hemos alcanzado la paridad de características entre todos los principales administradores de paquetes. Pero aún así, difieren bastante bajo el capó.
pnpm se parece a npm al principio porque su uso de CLI es similar, pero la administración de dependencias es muy diferente; El método de pnpm conduce a un mejor rendimiento y la mejor eficiencia de espacio en disco. Yarn Classic sigue siendo muy popular, pero se considera un software heredado y es posible que el soporte se elimine en un futuro próximo. Yarn Berry PnP es el nuevo chico del bloque, pero no se ha dado cuenta completamente de su potencial para revolucionar el panorama de los administradores de paquetes una vez más.
A lo largo de los años, muchos usuarios han preguntado quién usa qué administradores de paquetes y, en general, parece que la gente está especialmente interesada en la madurez y adopción de Yarn Berry PnP.
El objetivo de este artículo es brindarle muchas perspectivas para que tome una decisión sobre qué administrador de paquetes usar por su cuenta. Me gustaría señalar que no recomiendo un administrador de paquetes en particular. Depende de cómo sopeses los diferentes requisitos, ¡así que aún puedes elegir lo que quieras!
Fuente: https://blog.logrocket.com/javascript-package-managers-compared/
1601793300
React-Uploady is a lightweight library - enabling you to build (client-side) file-upload features with just a few lines of code. RU provides the foundations needed to upload files from the browser - The rest is up to you.
The philosophy behind this library is that it should be as simple as possible to use, yet customizable at every point. You can start simple, or you can can configure just about every aspect of the upload flow. For this purpose, RU provides components, hooks, and plenty of features. You get to choose which ones you need and only install the dependencies required (See Packages details below)
RU has a small footprint (by design) with very few (and small) dependencies.
Bundle | Minified size | GZipped size |
---|---|---|
core | 32.8KB | 10.7KB |
core + ui | 43.9KB | 13.5KB |
core + ui + chunked support | 53.6KB | 16.0KB |
everything | 78.7KB | 22.9KB |
Getting Started
We recommend checking out the Uploady README first to understand how to configure your uploads and how to access upload data (using the provided hooks or events).
It’s also worth reading the Important Concepts section below for some key concepts.
In case you need UI components (like an upload button), check out the UI packages.
Additional Resources
Our Storybook has many examples, both simple and advanced.
Checkout our Guides section for additional examples & information.
For a list of versions and changes, see the CHANGELOG
React-uploady is a mono-repo, and as such provides multiple packages with different functionality.
For React applications, at the very least, you will need the Uploady provider:
#Yarn:
$ yarn add @rpldy/uploady
#NPM:
$ npm i @rpldy/uploady
If you wish to use the uploading mechanism (no UI), at the very least, you will need the Uploader:
#Yarn:
$ yarn add @rpldy/uploader
#NPM:
$ npm i @rpldy/uploader
After that, you can add additional packages as needed. See below for more details.
For specific usage, see documentation in the relevant package README file.
For upload options see the @rpldy/uploady docs.
This examples shows how you add Uploady and UploadButton to your app. This is all it takes to get file uploading to work in your React application.
import React from "react";
import Uploady from "@rpldy/uploady";
import UploadButton from "@rpldy/upload-button";
const App = () => (<Uploady
destination={{ url: "https://my-server/upload" }}>
<UploadButton/>
</Uploady>);
In case you want to use your own component as the upload trigger, use the asUploadButton HOC:
import React from "react";
import Uploady from "@rpldy/uploady";
import { asUploadButton } from "@rpldy/upload-button";
const DivUploadButton = asUploadButton((props) => {
return <div {...props} style={{ cursor: "pointer" }}>
DIV Upload Button
</div>
});
const App = () => (<Uploady
destination={{ url: "https://my-server/upload" }}>
<DivUploadButton/>
</Uploady>);
import React from "react";
import Uploady, { useItemProgressListener } from "@rpldy/uploady";
import UploadButton from "@rpldy/upload-button";
//must be rendered inside <Uploady>
const LogProgress = () => {
useItemProgressListener((item) => {
console.log(`>>>>> (hook) File ${item.file.name} completed: ${item.completed}`);
});
return null;
}
const App = () => (<Uploady
destination={{ url: "https://my-server/upload" }}>
<LogProgress/>
<UploadButton/>
</Uploady>);
import React from "react";
import TusUploady from "@rpldy/tus-uploady";
import UploadButton from "@rpldy/upload-button";
const App = () => (<TusUploady
destination={{ url: "https://my-tus-server/upload" }}
chunkSize={2142880}
sendDataOnCreate>
<UploadButton/>
</TusUploady>);
Can be used with servers that support chunked uploads
import React from "react";
import ChunkedUploady from "@rpldy/chunked-uploady";
import UploadButton from "@rpldy/upload-button";
const App = () => (<ChunkedUploady
destination={{ url: "https://my-server/upload" }}
chunkSize={5242880}>
<UploadButton/>
</ChunkedUploady>);
These are the options that are passed to the uploader to configure aspects of the upload process. For example, whether files can be grouped in a single request (by default, no).
Upload Options are typically passed to the Uploady instance. But these can be overriden. For example, by props passed to the upload button. Or even during upload processing.
Passed as a part of the upload options. It’s an object that is used to configure the end-point where the files will be uploaded to. It’s type is defined here.
See more information in the Uploady README.
At the very least, a destination should contain a URL property with the server endpoint.
(uploader: UploaderType, trigger: Trigger<mixed>) => UploaderType
Enhancers are functions that can enhance an uploader instance. They are also passed as part of the options given to the Uploady instance.
As they are applied when the uploader instance is created, they can change the way uploader does things or pass different defaults.
See this guide for practical information and sample code.
When a file or files are handed over to the uploader, they are grouped into a batch. This batch will have its own lifetime events. With a batch ID, it is possible to cancel all files that are part of it. It can also be used to retry all files in the batch (see @rpldy/retry).
Each file (or URL) added to the uploader are wrapped by a BatchItem object. They will have a unique ID within the life-time of the uploader instance. A BatchItem has its own lifetime events.
RU supports resumable uploads through the tus protocol. Instead of using from @rpldy/uploady, use from @rpldy/tus-uploady and you will have resumable upload support on the client side. Your server will also have to support the same protocol for this to work of course.
See the @rpldy/tus-uploady documentation for more details.
React-uploady is also available on CDNs such as unpkg.com and jsdelivr.com
See this guide for more information on how to use.
You will most likely need the polyfill (core js) bundle as well (load it first):
You will most likely need the polyfill (core js) bundle as well (load it first):
Note that unpkg does a redirect to the latest version in case the URL doesn’t already contain it. So don’t copy any of the URLs above into your code. Instead, load them in the browser first and then copy the final URL from there (after the redirect).
logo’s wing thanks to Illustration Vectors by Vecteezy
Author: rpldy
Source Code: https://github.com/rpldy/react-uploady
#react #reactjs #javascript
1606274447
As JavaScript developers, we have access to several package managers. In this guide, we compare the most popular ones: npm, yarn, and pnpm.
In modern application development, we don’t write everything from scratch. Instead, we prefer to use existing open-source packages. Each of these packages has its own maintainers and community. So, using a package in our projects gives us some advantages like faster development, access to new, regular updates, and better security than custom-created script.
It’s common that one package depends on many other packages to work correctly. Similarly, the other packages may also depend on something like lodash, but lodash itself depends on several packages as well. In other words, the nested dependencies can sometimes become so complex that they are unable to handle dependency management manually.
Here’s when a package manager is extremely useful. Package managers are tools that automatically handle the dependencies of a project.
For example, a package manager can install new — or update existing — packages with a single command. Because everything is automated, so there’s no chance for human error. As JavaScript developers, we have access to several package managers. But, in this guide, we’ll compare the three most popular ones:
#javascript #npm #node #yarn #developer
1622207074
Who invented JavaScript, how it works, as we have given information about Programming language in our previous article ( What is PHP ), but today we will talk about what is JavaScript, why JavaScript is used The Answers to all such questions and much other information about JavaScript, you are going to get here today. Hope this information will work for you.
JavaScript language was invented by Brendan Eich in 1995. JavaScript is inspired by Java Programming Language. The first name of JavaScript was Mocha which was named by Marc Andreessen, Marc Andreessen is the founder of Netscape and in the same year Mocha was renamed LiveScript, and later in December 1995, it was renamed JavaScript which is still in trend.
JavaScript is a client-side scripting language used with HTML (Hypertext Markup Language). JavaScript is an Interpreted / Oriented language called JS in programming language JavaScript code can be run on any normal web browser. To run the code of JavaScript, we have to enable JavaScript of Web Browser. But some web browsers already have JavaScript enabled.
Today almost all websites are using it as web technology, mind is that there is maximum scope in JavaScript in the coming time, so if you want to become a programmer, then you can be very beneficial to learn JavaScript.
In JavaScript, ‘document.write‘ is used to represent a string on a browser.
<script type="text/javascript">
document.write("Hello World!");
</script>
<script type="text/javascript">
//single line comment
/* document.write("Hello"); */
</script>
#javascript #javascript code #javascript hello world #what is javascript #who invented javascript