6 якостей, завдяки котрим Yarn є найкращим менеджером пакетів для JavaScript
() translation by (you can also view the original English article)
Yarn - це клієнт npm (* менеджер пакунків для Node. Тут і надалі примітка перекладача) з відкритим первинним кодом, який було розроблено командою Facebook та у багатьох аспектах переважає стандартний клієнт npm. У даному посібнику я зосереджуся на розгляданні шести ключових характеристик, які дозволяють Yarn бути чудовим інструментом:
- Швидкість
- Надійність установок
- Можливість перевірки ліцензій
- Сумісність із npm та Bower
- Наявність декількох реєстрів
- Можливість використання емодзі
1. Швидкість
Одним із досягнень Yarn є його швидкість роботи в порівнянні зі стандартним npm. Але наскільки він швидкий? Недавно проведене еталонне тестування показало, що Yarn був у два-три рази швидше npm. У цьому тесті замірявся час установлення React, Angular 2 та Ember. Це вельми надійна перевірка менеджера пакетів, оскільки кожний із цих фреймворків потребує багато залежностей та містить велику долю залежностей реальних веб-застосунків.
Давайте додамо ще одне значення та самостійно протестуємо швидкість шляхом установлення модуля create-react-app за допомогою yarn та npm. Нижче наведено результат установки за допомогою 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. |
Ось результат установлення за допомогою 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 |
Так. Цей результат безумовно узгоджується з іншими повідомленнями про значну перевагу yarn у швидкості. Yarn установив модулі за .59 секунд, тоді як npm знадобилося 9.422 секунд. Yarn був швидше в 3.63 рази.
2. Надійність установок
Також yarn може похвалитися більш надійними установками, ніж npm. Коли встановлення вважається надійним? Якщо при наступних встановленнях відбувається збій чи виходить інший результат, то установка є ненадійною. Це може відбуватися по двом причинам:
- Тимчасові проблеми комп'ютерної мережі можуть послужити причиною збою при отриманні пакетів.
- Результатом виходу нових версій пакетів можуть бути зміни, через які пакети стають несумісними з іншими пакетами та порушується робота застосунку.
Yarn упорується з обома проблемами.
Офлайн кеш
Yarn використовує глобальний офлайн кеш для зберігання пакетів, котрі ви одного разу встановили, тому при установках нових версій використовується гешована версія та досягається усталеність до періодичних збоїв комп'ютерної мережі. Ви можете дізнатися про розташування гешу yarn у вас за допомогою команди:
1 |
$ yarn cache dir |
2 |
/Users/gigi.sayfan/Library/Caches/Yarn/v1 |
Ось перші п'ять пакетів мого офлайн гешу:
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 спроможен на більше. Він може мати повне офлайн дзеркало (* копія), яке буде використовуватися оновленими версіями yarn.
Файл yarn.lock
Файл yarn.lock (* файл для блокування ресурсів yarn) оновлюється кожного разу, коли ви додаєте чи оновлюєте версію пакета. У ньому визначається, головним чином, точна версія кожного пакета, котру може бути вказано в package.json за допомогою часткового визначення версії (наприклад, вказані тільки головний та другорядний номери версії), та його залежностей.
Нижче наводиться початок типового файлу yarn.lock. Ви можете побачити версію таку версію, як її вказано в package.json, наприклад, "abbrev@1", та точно визначену версію "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" |
Але чому?
Також yarn надає вам команду yarn why
для роз'яснення причини встановлення певного пакета у вашому проекті:
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. Можливість перевірки ліцензій
Для деяких проектів необхідне дотримання певних ліцензійних вимог чи просто створення звіту для власних чи зовнішніх цілей. Це легко здійснюється за допомогою команди Yarn yarn licenses ls
. У результаті створюється компактний звіт, що містить офіційне ім'я пакета, його URL-адресу та ліцензію. Нижче наведено приклад:
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 може навіть створити для вас звільнення від відповідальності при виконанні команди yarn licenses generate-disclaimer
. У результаті виводиться текст із повідомленням про звільнення від відповідальності та текст для кожного пакета вашого застосунку. Нижче наведено фрагмент звільнення від відповідальності, згенерованого для мого тестового проекту.
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. Сумісність із npm та Bower
Yarn повністю сумісний із npm, оскільки є просто іншим клієнтом, який працює з реєстрами npm. На самому початку розвитку Yarn підтримував Bower, проте через деякий час було прийнято рішення припинити підтримку Bower.
Головною причиною була не дуже добра сумісність із Bower. При цьому звільнялася папка bower_components або не доставлявся жоден пакет у новому проекті. Проте іншою причиною є те, що команда Yarn не бажала підтримувати розподіл у сфері керування пакетами і, навпаки, вважала за краще перехід всіх на npm.
Якщо ви зацікавлені у використанні Bower та не хотіли би переходити на інший пакетний менеджер просто зараз, ви як і раніше можете використовувати Yarn, проте, додайте наступний фрагмент коду до вашого файлу package.json.
1 |
"scripts": { |
2 |
"postinstall": "bower install" |
3 |
} |
5. Наявність декількох реєстрів
Yarn може працювати з декількома типами реєстрів. Якщо ви просто додаєте пакет, то, за налаштуванням, Yarn буде використовувати свій реєстр npm (котрий не є стандартним реєстром npm). Проте, Yarn також може додавати пакети з файлів, віддалених архівів у форматі .tar з первинним кодом чи віддалених репозиторіїв git (* система контролю версій).
Для того, щоб подивитися поточний сконфігурований реєстр npm, виконайте:
1 |
$ yarn config get registry |
2 |
https://registry.yarnpkg.com |
Для того щоб установити інший тип реєстру, використовуйте: yarn config set registry <registry url>
Для додавання пакетів із різних джерел використовуйте наступні команди для додавання:
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. Емодзі «рулюють»
Деяким людям подобаються емодзі, іншим ні. З самого початку Yarn відображував емодзі автоматично, проте тільки на операційній системі Mac OS X. В результаті на Yarn посипалося каміння з обох боків: ненависники емодзі були засмучені тим, що їх консоль рябіла емодзі, тим часом як прихильники емодзі були засмучені відсутністю емодзі на Windows та Linux.
Зараз емодзі за налаштуванням не відображуються на macOS, і ви можете умикнути емодзі за допомогою прапорця --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... |
Все товариство JavaScript-розробників дуже позитивно відреагувало на появу Yarn. Також відбувається багато галасу навколо Yarn. Yarn вже впорався з деякими проблемами, наприклад, зайвою підтримкою Bower та використанням емодзі за налаштуванням. Перехід з npm на використання Yarn проходить дуже легко. Обов'язково його спробуйте.ry.