6 cosas que hacen que Yarn sea el mejor administrador de paquetes de JavaScript
Spanish (Español) translation by Juan Pablo Diaz Cuartas (you can also view the original English article)
Yarn es un cliente npm de código abierto que se desarrolló en Facebook y mejora muchos aspectos del cliente npm estándar. En este tutorial, me centraré en las seis características principales que hacen que Yarn sea impresionante:
- Velocidad
- Instalaciones robustas
- Comprobaciones de licencia
- Compatibilidad con npm y Bower
- Registros múltiples
- Emojis
1. Velocidad
Uno de las afirmaciones de la fama de Yarn es su velocidad en comparación con el cliente estándar de npm. Pero, ¿qué tan rápido es? En un punto de referencia reciente, Yarn era dos o tres veces más rápido que npm. El punto de referencia cronometró la instalación de React, Angular 2 y Ember. Esta es una prueba bastante buena para un administrador de paquetes ya que cada uno de estos marcos extrae un conjunto de dependencias y representa una parte importante de las dependencias de una aplicación web del mundo real.
Agreguemos otro punto de datos y compruébalo instalando una aplicación create-react usando tanto yarn como npm. Aquí está la instalación usando yarn:
1 |
$ yarn global add create-react-app --prefix /usr/local |
2 |
yarn global v0.27.5 |
3 |
warning package.json: No license field |
4 |
warning No license field |
5 |
[1/4] Resolving packages... |
6 |
[2/4] Fetching packages... |
7 |
[3/4] Linking dependencies... |
8 |
[4/4] Building fresh packages... |
9 |
success Installed "create-react-app@1.4.0" with binaries: |
10 |
- create-react-app |
11 |
warning No license field |
12 |
Done in 2.59s. |
Aquí está la instalación usando npm:
1 |
$ npm install -g create-react-app |
2 |
/usr/local/bin/create-react-app -> |
3 |
/usr/local/lib/node_modules/create-react-app/index.js |
4 |
+ create-react-app@1.4.0 |
5 |
added 80 packages in 9.422s |
Sí. Esto definitivamente corrobora otros informes sobre una ventaja de velocidad significativa para el yarn. Yarn instalado en 2.59 segundos, mientras que npm tomó 9.422 segundos. ¡Yarn fue 3,63 veces más rápido!
2. Instalaciones robustas
Yarn también cuenta con instalaciones más robustas que npm. ¿Qué hace que una instalación sea escamosa? Si las instalaciones posteriores fallan o producen un resultado diferente, una instalación es escamosa. Hay dos causas principales:
- Los problemas de red transitoria pueden hacer que fallen los paquetes del registro.
- Las nuevas versiones de paquetes pueden dar como resultado cambios incompatibles y de ruptura.
Yarn aborda ambas preocupaciones.
Caché sin conexión
Yarn usa un caché sin conexión global para almacenar los paquetes que ha instalado una vez, por lo que las nuevas instalaciones utilizan la versión almacenada en caché y evitan las fallas debido a fallas de red intermitentes. Puede encontrar dónde está su caché de yarn escribiendo:
1 |
$ yarn cache dir |
2 |
/Users/gigi.sayfan/Library/Caches/Yarn/v1 |
Estos son los primeros cinco paquetes en mi caché sin conexión:
1 |
$ ls `yarn cache dir` | head -5 |
2 |
npm-@kadira |
3 |
npm-@types |
4 |
npm-Base64-0.2.1-ba3a4230708e186705065e66babdd4c35cf60028 |
5 |
npm-JSONStream-0.8.4-91657dfe6ff857483066132b4618b62e8f4887bd |
6 |
npm-abab-1.0.3-b81de5f7274ec4e756d797cd834f303642724e5d |
Yarn puede ir aún más lejos y tener un espejo fuera de línea completo que funcionará a través de las actualizaciones del propio yarn.
El archivo yarn.lock
El archivo yarn.lock se actualiza cada vez que agrega o actualiza una versión. Básicamente, fija la versión exacta de cada paquete que se puede especificar en package.json utilizando versiones parciales (por ejemplo, solo mayor y menor) y sus dependencias.
Aquí está el comienzo de un archivo típico de yarn.lock. Puede ver la versión como se especifica en package.json como "abbrev @ 1" y la versión anclada "1.1.0".
1 |
cat yarn.lock | head -18 |
2 |
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. |
3 |
# yarn lockfile v1 |
4 |
|
5 |
|
6 |
abab@^1.0.3: |
7 |
version "1.0.3" |
8 |
resolved "https://registry.yarnpkg.com/abab/- |
9 |
/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" |
10 |
|
11 |
abbrev@1: |
12 |
version "1.1.0" |
13 |
resolved "https://registry.yarnpkg.com/abbrev/- |
14 |
/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" |
15 |
|
16 |
accepts@~1.3.3: |
17 |
version "1.3.4" |
18 |
resolved "https://registry.yarnpkg.com/accepts/ |
19 |
-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" |
20 |
dependencies: |
21 |
mime-types "~2.1.16" |
22 |
negotiator "0.6.1" |
¿Pero por qué?
Yarn también le da el comando yarn why para explicar por qué un paquete en particular está instalado en su proyecto:
1 |
$ yarn why worker-farm |
2 |
yarn why v0.27.5 |
3 |
[1/4] Why do we have the module "worker-farm"...? |
4 |
[2/4] Initialising dependency graph... |
5 |
[3/4] Finding dependency... |
6 |
[4/4] Calculating file sizes... |
7 |
info This module exists because "react-scripts#jest#jest-cli" |
8 |
depends on it. |
9 |
info Disk size without dependencies: "132kB" |
10 |
info Disk size with unique dependencies: "212kB" |
11 |
info Disk size with transitive dependencies: "244kB" |
12 |
info Number of shared dependencies: 2 |
13 |
Done in 1.38s. |
3. Comprobaciones de licencia
Algunos proyectos deben cumplir con ciertos requisitos de licencia o simplemente generar un informe para fines internos o externos. Yarn lo hace realmente fácil con el comando yarn licenses ls. Produce un informe compacto que incluye el nombre completo del paquete, su URL y la licencia. Aquí hay un ejemplo:
1 |
$ yarn licenses ls | head -20 |
2 |
yarn licenses v0.27.5 |
3 |
├─ abab@1.0.3 |
4 |
│ ├─ License: ISC |
5 |
│ └─ URL: git+https://github.com/jsdom/abab.git |
6 |
├─ abbrev@1.1.0 |
7 |
│ ├─ License: ISC |
8 |
│ └─ URL: https://github.com/isaacs/abbrev-js |
9 |
├─ accepts@1.3.4 |
10 |
│ ├─ License: MIT |
11 |
│ └─ URL: https://github.com/jshttp/accepts.git |
12 |
├─ acorn-dynamic-import@2.0.2 |
13 |
│ ├─ License: MIT |
14 |
│ └─ URL: https://github.com/kesne/acorn-dynamic-import |
15 |
├─ acorn-globals@3.1.0 |
16 |
│ ├─ License: MIT |
17 |
│ └─ URL: https://github.com/ForbesLindesay/acorn-globals.git |
18 |
├─ acorn-jsx@3.0.1 |
19 |
│ ├─ License: MIT |
20 |
│ └─ URL: https://github.com/RReverser/acorn-jsx |
Yarn puede incluso generar un descargo de responsabilidad para usted con licencias yarn generate-disclaimer. El resultado es un texto con un mensaje de exención de responsabilidad y texto para cada paquete en su aplicación. Aquí hay un ejemplo del descargo de responsabilidad generado para mi proyecto de prueba:
1 |
----- |
2 |
|
3 |
The following software may be included in this product: |
4 |
utils-merge. A copy of the source code may be downloaded from |
5 |
git://github.com/jaredhanson/utils-merge.git. This software |
6 |
contains the following license and notice below: |
7 |
|
8 |
(The MIT License) |
9 |
|
10 |
Copyright (c) 2013 Jared Hanson |
11 |
|
12 |
Permission is hereby granted, free of charge, to any person |
13 |
obtaining a copy of this software and associated documentation |
14 |
files (the "Software"), to deal in the Software without |
15 |
restriction, including without limitation the rights to use, |
16 |
copy, modify, merge, publish, distribute, sublicense, and/or |
17 |
sell copies of the Software, and to permit persons to whom the |
18 |
Software is furnished to do so, subject to the following |
19 |
conditions: |
20 |
|
21 |
The above copyright notice and this permission notice shall be |
22 |
included in all copies or substantial portions of the Software. |
23 |
|
24 |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
25 |
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
26 |
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
27 |
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
28 |
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
29 |
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
30 |
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
31 |
OTHER DEALINGS IN THE SOFTWARE. |
32 |
|
33 |
----- |
34 |
|
35 |
The following software may be included in this product: uuid. |
36 |
A copy of the source code may be downloaded from |
37 |
https://github.com/defunctzombie/node-uuid.git. This software |
38 |
contains the following license and notice below: |
39 |
|
40 |
Copyright (c) 2010-2012 Robert Kieffer |
41 |
MIT License - http://opensource.org/licenses/mit-license.php |
42 |
|
43 |
----- |
4. Compatibilidad con npm y Bower
Yarn es totalmente compatible con npm, ya que es solo un cliente diferente que trabaja con registros npm. Muy temprano apoyó a Bower, pero poco después se tomó la decisión de abandonar el apoyo de Bower.
La razón principal era que el soporte de Bower no funcionaba muy bien y vaciaba el directorio bower_components o no obtenía ningún paquete de bower en un proyecto nuevo. Pero otra razón es que el equipo de Yarn no quería alentar la fragmentación en el ámbito de la administración de paquetes y prefería que todos cambiaran a npm.
Si está invirtiendo en Bower y no desea migrar en este momento, aún puede usar Yarn, pero agregue el siguiente fragmento a su archivo package.json:
1 |
"scripts": {
|
2 |
"postinstall": "bower install" |
3 |
} |
5. Registros múltiples
Yarn puede trabajar con múltiples tipos de registro. De forma predeterminada, si solo agrega un paquete, usará su registro npm (que no es el registro estándar de npm). Pero también puede agregar paquetes de archivos, tarballs remotos o repositorios git remotos.
Para ver el registro npm configurado actual:
1 |
$ yarn config get registry |
2 |
https://registry.yarnpkg.com |
Para establecer un tipo de registro diferente: yarn config set registry <registry url>
Para agregar paquetes de diferentes ubicaciones, use los siguientes comandos de agregar:
1 |
# Configured npm registry |
2 |
yarn add <pkg-name> |
3 |
|
4 |
# Local package |
5 |
yarn add file:/<path to local package directory |
6 |
|
7 |
# Remote tarball |
8 |
yarn add https://<path to compressed tarball>.tgz |
9 |
|
10 |
# Remote git repo |
11 |
yarn add <git remote-url> |
6. Emojis FTW!
A algunas personas les gustan los emojis, y otras no. Yarn mostró originalmente emojis automáticamente, pero solo en Mac OS X. Empezó a arder en ambos campos: los que odiaban a los emoji estaban molestos porque su consola en Mac OS X estaba atestada de emojis, y los amantes de los emojis estaban molestos porque no tenían emojis en Windows y Linux.
Ahora, los emojis no se muestran en macOS de manera predeterminada, y puedes habilitar emojis con el indicador --emoji:
1 |
$ yarn install --emoji |
2 |
yarn install v0.27.5 |
3 |
[1/4] 🔍 Resolving packages... |
4 |
[2/4] 🚚 Fetching packages... |
5 |
[3/4] 🔗 Linking dependencies... |
La comunidad de JavaScript es en general muy positiva, y hay mucho impulso detrás de Yarn. Ya ha abordado algunos problemas, como soporte redundante de Bower y emojis por defecto. Migrar a Yarn from npm es muy fácil. Recomiendo encarecidamente que pruebes.ry.



