Spec-Zone.ru › Yarn Classic

1. Обзор

📝 PnP — это функция Yarn, не путайте её с pnpm, которая является другим, самостоятельным менеджером JavaScript-пакетов.

Plug’n’Play — это альтернативная стратегия установки, представленная в сентябре 2018 года. Она обладает интересными характеристиками, которые подходят для широкого круга проектов, и разработана для совместимости с текущей экосистемой.

Способ работы обычных установок прост: Yarn генерирует директорию node_modules, которую затем может использовать Node.js. В этом контексте Node.js не знает, что такое пакет: он работает только с файлами. «Существует ли этот файл здесь? Нет? Посмотрим в родительской node_modules. Есть ли он здесь? Всё ещё нет? Жаль… родительская папка!» — и так продолжается до тех пор, пока не найдётся что-то, соответствующее одному из вариантов. Это чрезвычайно неэффективно.

Если подумать, Yarn знает всё о вашем дереве зависимостей — он даже устанавливает его! Так зачем Node.js поручать поиск ваших пакетов на диске? Почему мы не можем просто запросить Yarn, чтобы он сказал нам, где искать пакет X, необходимый для пакета Y? Именно для этого предназначен Plug’n’Play (сокращённо PnP). Вместо генерации директории node_modules и делегирования разрешения Node.js, мы теперь генерируем единственный файл .pnp.js и позволяем Yarn сказать нам, где найти наши пакеты. Это обеспечивает множество преимуществ:

  • Директория node_modules содержит огромное количество файлов. Её создание составляет более 70% времени, необходимого для выполнения yarn install с кэшем.

  • Поскольку у Node.js нет понятия «пакет», он не знает, предназначен ли файл для доступа, помимо его доступности. Вполне возможно, что код, который вы написали, будет работать в режиме разработки, но сломается в производстве, потому что вы забыли указать одну из ваших зависимостей в вашем package.json — и вы не узнаете об этом, пока это не станет проблемой, и вы не потратите день на расследование проблемы.

  • Даже во время выполнения Node.js должен совершить множество вызовов stat и readdir для определения, где должно завершиться разрешение. Это чрезвычайно неэффективно и является одной из причин, по которой запуск Node.js-приложения занимает много времени — прежде чем начать его выполнение, Node.js тратит время на запрос информации о файловой системе, которую Yarn мог бы ему предоставить.

  • Наконец, сама конструкция папки node_modules непрактична, так как она не позволяет эффективно дедуплицировать пакеты так, как хотелось бы. Поскольку два пакета с одинаковым именем, но разными версиями не могут сосуществовать в одной директории, мы не можем гарантировать идеального объединения. Аналогично, поскольку папки node_modules глубоко вложены и зависят от зависимостей проекта, их нельзя использовать совместно между проектами.

Все эти проблемы и многое другое решаются с помощью Plug’n’Play.

© 2016–present Yarn Contributors
Licensed under the BSD License.
https://classic.yarnpkg.com/en/docs/pnp

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API