Advertisement
  1. Code
  2. Coding Fundamentals
  3. Workflow

6 якостей, завдяки котрим Yarn є найкращим менеджером пакетів для JavaScript

Scroll to top
Read Time: 8 min

() translation by (you can also view the original English article)

Yarn - це клієнт npm (* менеджер пакунків для Node. Тут і надалі примітка перекладача) з відкритим первинним кодом, який було розроблено командою Facebook та у багатьох аспектах переважає стандартний клієнт npm. У даному посібнику я зосереджуся на розгляданні шести ключових характеристик, які дозволяють Yarn бути чудовим інструментом:

  1. Швидкість
  2. Надійність установок
  3. Можливість перевірки ліцензій
  4. Сумісність із npm та Bower
  5. Наявність декількох реєстрів
  6. Можливість використання емодзі

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. Коли встановлення вважається надійним? Якщо при наступних встановленнях відбувається збій чи виходить інший результат, то установка є ненадійною. Це може відбуватися по двом причинам:

  1. Тимчасові проблеми комп'ютерної мережі можуть послужити причиною збою при отриманні пакетів.
  2. Результатом виходу нових версій пакетів можуть бути зміни, через які пакети стають несумісними з іншими пакетами та порушується робота застосунку.

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...
Yarn є найкращим менеджером пакетів для JavaScript. Він подібний до npm, проте значно швидше. Yarn розв'язує серйозні проблеми «крихкої» установки великомасштабних проектів, підтримує використання безлічі типів реєстрів та до цього ще й надає можливість використовувати емодзі. t. Як ви бачите, окрім відповідних ресурсів для вивчення JavaScript також, щоб ви не нудьгували, є багато бібліотек та фреймворків. Якщо ви шукаєте додаткові ресурси для вивчення чи використання у роботі, гляньте, що ми маємо на Envato marketplace.a>.
Все товариство JavaScript-розробників дуже позитивно відреагувало на появу Yarn. Також відбувається багато галасу навколо Yarn. Yarn вже впорався з деякими проблемами, наприклад, зайвою підтримкою Bower та використанням емодзі за налаштуванням. Перехід з npm на використання Yarn проходить дуже легко. Обов'язково його спробуйте.ry.
Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.