Статьи

6 вещей, которые делают пряжу лучшим менеджером пакетов JavaScript

Yarn — это npm-клиент с открытым исходным кодом, разработанный на Facebook и улучшающий многие аспекты стандартного npm-клиента. В этом уроке я сосредоточусь на шести основных функциях, которые делают Yarn потрясающим:

  1. скорость
  2. Надежная установка
  3. Проверка лицензии
  4. Совместимость с npm и Bower
  5. Несколько реестров
  6. Emojis

Одним из требований Yarn к славе является его скорость по сравнению со стандартным клиентом npm. Но как быстро это? В недавнем тесте Yarn был в два-три раза быстрее npm. Тест рассчитал время установки React, Angular 2 и Ember. Это довольно хороший тест для менеджера пакетов, поскольку каждая из этих платформ тянет за собой кучу зависимостей и представляет основную долю зависимостей реального веб-приложения.

Давайте добавим еще одну точку данных и проверим сами, установив приложение create-реакции-приложение, используя yarn и npm. Вот установка с использованием пряжи:

01
02
03
04
05
06
07
08
09
10
11
12
$ yarn global add create-react-app —prefix /usr/local
yarn global v0.27.5
warning package.json: No license field
warning No license field
[1/4] Resolving packages…
[2/4] Fetching packages…
[3/4] Linking dependencies…
[4/4] Building fresh packages…
success Installed «create-react-app@1.4.0» with binaries:
      — create-react-app
warning No license field
Done in 2.59s.

Вот установка с использованием npm:

1
2
3
4
5
$ npm install -g create-react-app
/usr/local/bin/create-react-app ->
/usr/local/lib/node_modules/create-react-app/index.js
+ create-react-app@1.4.0
added 80 packages in 9.422s

Ага. Это определенно подтверждает другие сообщения о значительном скоростном преимуществе пряжи. Пряжа была установлена ​​за 2,59 секунды, а npm заняло 9,422 секунды. Пряжа была в 3,63 раза быстрее!

Пряжа также может похвастаться более надежной установкой, чем npm. Что делает установку ненадежной? Если последующие установки завершаются неудачно или приводят к другому результату, тогда установка происходит некорректно. Есть две основные причины:

  1. Временные проблемы с сетью могут привести к сбою загрузки пакетов из реестра.
  2. Новые выпуски пакетов могут привести к несовместимым и разрушительным изменениям.

Пряжа решает обе проблемы.

Yarn использует глобальный автономный кэш для хранения пакетов, которые вы установили один раз, поэтому новые установки используют кэшированную версию и избегают нестабильности из-за периодических сбоев сети. Вы можете узнать, где находится кэш пряжи, набрав:

1
2
$ yarn cache dir
/Users/gigi.sayfan/Library/Caches/Yarn/v1

Вот первые пять пакетов в моем автономном кеше:

1
2
3
4
5
6
$ ls `yarn cache dir` |
npm-@kadira
npm-@types
npm-Base64-0.2.1-ba3a4230708e186705065e66babdd4c35cf60028
npm-JSONStream-0.8.4-91657dfe6ff857483066132b4618b62e8f4887bd
npm-abab-1.0.3-b81de5f7274ec4e756d797cd834f303642724e5d

Пряжа может пойти еще дальше и иметь полностью автономное зеркало, которое будет работать при обновлении самой пряжи.

Файл yarn.lock обновляется всякий раз, когда вы добавляете или обновляете версию. По сути, он фиксирует точную версию каждого пакета, которая может быть указана в package.json, используя частичное управление версиями (например, только основные и второстепенные) и его зависимости.

Вот начало типичного файла yarn.lock. Вы можете увидеть версию, указанную в package.json, например «abbrev @ 1» и закрепленную версию «1.1.0».

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
cat yarn.lock |
# THIS IS AN AUTOGENERATED FILE.
# yarn lockfile v1
 
 
abab@^1.0.3:
  version «1.0.3»
  resolved «https://registry.yarnpkg.com/abab/-
  /abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d»
 
abbrev@1:
  version «1.1.0»
  resolved «https://registry.yarnpkg.com/abbrev/-
  /abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f»
 
accepts@~1.3.3:
  version «1.3.4»
  resolved «https://registry.yarnpkg.com/accepts/
  -/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f»
  dependencies:
    mime-types «~2.1.16»
    negotiator «0.6.1»

Yarn также дает вам команду yarn why чтобы объяснить, почему конкретный пакет установлен в вашем проекте:

01
02
03
04
05
06
07
08
09
10
11
12
13
$ yarn why worker-farm
yarn why v0.27.5
[1/4] Why do we have the module «worker-farm»…?
[2/4] Initialising dependency graph…
[3/4] Finding dependency…
[4/4] Calculating file sizes…
info This module exists because «react-scripts#jest#jest-cli»
     depends on it.
info Disk size without dependencies: «132kB»
info Disk size with unique dependencies: «212kB»
info Disk size with transitive dependencies: «244kB»
info Number of shared dependencies: 2
Done in 1.38s.

Некоторые проекты должны соблюдать определенные лицензионные требования или просто создавать отчет для внутренних или внешних целей. С помощью команды yarn licenses ls . Он создает компактный отчет, который включает полное имя пакета, его URL и лицензию. Вот пример:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
$ yarn licenses ls |
yarn licenses v0.27.5
├─ abab@1.0.3
│ ├─ License: ISC
│ └─ URL: git+https://github.com/jsdom/abab.git
├─ abbrev@1.1.0
│ ├─ License: ISC
│ └─ URL: https://github.com/isaacs/abbrev-js
├─ accepts@1.3.4
│ ├─ License: MIT
│ └─ URL: https://github.com/jshttp/accepts.git
├─ acorn-dynamic-import@2.0.2
│ ├─ License: MIT
│ └─ URL: https://github.com/kesne/acorn-dynamic-import
├─ acorn-globals@3.1.0
│ ├─ License: MIT
│ └─ URL: https://github.com/ForbesLindesay/acorn-globals.git
├─ acorn-jsx@3.0.1
│ ├─ License: MIT
│ └─ URL: https://github.com/RReverser/acorn-jsx

Пряжа может даже генерировать для вас отказ от ответственности с yarn licenses generate-disclaimer . В результате получается некоторый текст с сообщением об отказе от ответственности и текстом для каждого пакета в вашем приложении. Вот пример отказа от ответственности, сгенерированного для моего тестового проекта:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
——
 
The following software may be included in this product:
utils-merge.
git://github.com/jaredhanson/utils-merge.git.
contains the following license and notice below:
 
(The MIT License)
 
Copyright (c) 2013 Jared Hanson
 
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the «Software»), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
 
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
 
THE SOFTWARE IS PROVIDED «AS IS», WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT.
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
 
——
 
The following software may be included in this product: uuid.
A copy of the source code may be downloaded from
https://github.com/defunctzombie/node-uuid.git.
contains the following license and notice below:
 
Copyright (c) 2010-2012 Robert Kieffer
MIT License — http://opensource.org/licenses/mit-license.php
 
——

Yarn полностью совместим с npm, поскольку это просто другой клиент, который работает с реестрами npm. Очень рано он поддержал Бауэра, но вскоре после того, как было принято решение отказаться от поддержки Бауэра.

Основная причина заключалась в том, что поддержка Bower работала не очень хорошо и очищала каталог bower_components или не получала никаких пакетов bower в новом проекте. Но другая причина в том, что команда Yarn не хотела поощрять фрагментацию на арене управления пакетами и вместо этого предпочитала, чтобы все переключались на npm.

Если вы инвестировали в Bower и не хотите мигрировать прямо сейчас, вы все равно можете использовать Yarn, но добавьте следующий фрагмент в свой файл package.json:

1
2
3
«scripts»: {
    «postinstall»: «bower install»
}

Пряжа может работать с несколькими типами реестра. По умолчанию, если вы просто добавите пакет, он будет использовать свой реестр npm (который не является стандартным реестром npm). Но он также может добавлять пакеты из файлов, удаленных архивов или удаленных репозиториев git.

Чтобы увидеть текущий настроенный реестр npm:

1
2
$ yarn config get registry
https://registry.yarnpkg.com

Чтобы установить другой тип реестра: yarn config set registry <registry url>

Чтобы добавить пакеты из разных мест, используйте следующие команды добавления:

01
02
03
04
05
06
07
08
09
10
11
# Configured npm registry
yarn add <pkg-name>
 
# Local package
yarn add file:/<path to local package directory>
 
# Remote tarball
yarn add https://<path to compressed tarball>.tgz
 
# Remote git repo
yarn add <git remote-url>

Некоторые люди любят смайлики, а некоторые нет. Изначально Yarn отображал смайлики автоматически, но только в Mac OS X. Он загорелся из обоих лагерей: ненавистники смайликов были расстроены тем, что их консоль в Mac OS X была загромождена смайликами, а любители смайликов были расстроены тем, что у них не было смайликов на Windows и Linux.

Теперь смайлики не отображаются в macOS по умолчанию, и вы можете включить смайлики с флагом --emoji :

1
2
3
4
5
$ yarn install —emoji
yarn install v0.27.5
[1/4] 🔍 Resolving packages…
[2/4] 🚚 Fetching packages…
[3/4] 🔗 Linking dependencies…

Yarn — лучший менеджер пакетов JavaScript. Он совместим с npm, но намного, намного быстрее. Он решает серьезные проблемы для крупномасштабных проектов с нестабильной установкой, поддерживает несколько типов реестров и имеет смайлики для загрузки.

JavaScript, хотя и не без кривых обучения, имеет множество библиотек и структур, которые, как вы можете видеть, заняты. Если вы ищете дополнительные ресурсы для обучения или использования в своей работе, посмотрите, что у нас есть на Envato Market .

Сообщество JavaScript в целом очень позитивно, и за Yarn много движений. В нем уже рассмотрены некоторые проблемы, такие как избыточная поддержка Bower и эмодзи по умолчанию. Переход на пряжу с npm очень прост. Я настоятельно рекомендую вам попробовать.