Skip to content

Commit

Permalink
В статье про менеджмент зависимостей исправлены ошибки в картинках и …
Browse files Browse the repository at this point in the history
…внесены небольшие косметические изменения
  • Loading branch information
NEWESTERS committed Nov 1, 2023
1 parent cae9e58 commit a7e00ac
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 5 deletions.
Binary file not shown.
Binary file modified public/images/dependency-management/node-module-resolution.webp
Binary file not shown.
Binary file modified public/images/dependency-management/phantom-dependency.webp
Binary file not shown.
Binary file modified public/images/dependency-management/pnpm-node-modules.webp
Binary file not shown.
28 changes: 23 additions & 5 deletions src/content/articles/dependency-management.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ heroImage: "/hacknote-js/images/dependency-management/hero.png"
telegramPostId: "28"
---

import Aside from "@components/astro/Aside.astro";

Javascript стремительно развивается на протяжении уже более 20 лет. За это время появлялось огромное количество различных решений для разработки веб-приложений и, несмотря на развитие веб-стандартов и самой веб-платформы, сейчас уже достаточно тяжело представить себе проект, не использующий никаких сторонних библиотек. Для многих разработчиков процесс установки зависимостей представляет собой некую магию, которая происходит при выполнении `npm install`.

![Магический npm install](/hacknote-js/images/dependency-management/install-easy.webp)
Expand Down Expand Up @@ -222,7 +224,13 @@ registry=https://registry.npmjs.com

![Дубликат зависимости для плагина](/hacknote-js/images/dependency-management/duplicated-plugin-host.webp)

Обратите внимание, что понятие "плагин" в данном случае довольно широкое и, например, библиотека React-компонентов будет фактически являться плагином для React (кстати, React в приложении должен присутствовать в единственном экземпляре, и если пакетный менеджер установит для библиотеки компонентов собственный React, то помимо засорения `node_modules` приложение может перестать работать).
Обратите внимание, что понятие "плагин" в данном случае довольно широкое и, например, библиотека React-компонентов будет фактически являться плагином для React.

<Aside title="Кстати о React" type="warning">
React в приложении должен присутствовать в единственном экземпляре, и если
пакетный менеджер установит для библиотеки компонентов собственный React, то
помимо засорения `node_modules` приложение может перестать работать
</Aside>

При этом плагин может быть совместим только с определёнными версиями хост-пакета, поскольку использует его API, а значит может перестать работать, если этот API будет удалён.

Expand Down Expand Up @@ -268,10 +276,15 @@ NPM 7 и выше автоматически установит недостаю
}
```

Кстати, это не единственная для NPM аналогия с СSS, команда [npm query](https://docs.npmjs.com/cli/v8/commands/npm-query) поддерживает [СSS-селекторы для анализа дерева зависимостей](https://docs.npmjs.com/cli/v8/using-npm/dependency-selectors).

Похожее поле есть и в других пакетных менеджерах, но, поскольку для `package.json` нет никакой общей спецификации, работает и называется оно по разному. Например, в Yarn для решения этой проблемы есть поле [resolutions](https://classic.yarnpkg.com/lang/en/docs/selective-version-resolutions/).

<Aside title="Аналогия с CSS">
Принцип работы `overrides` — не единственная для NPM аналогия с СSS, команда
[npm query](https://docs.npmjs.com/cli/v8/commands/npm-query) поддерживает
[СSS-селекторы для анализа дерева
зависимостей](https://docs.npmjs.com/cli/v8/using-npm/dependency-selectors).
</Aside>

### Опциональный хост

Может случиться так, что библиотека окажется достаточно универсальна, что будет способна работать без хост-пакета, но при его наличии будет производить какие-то дополнительные действия. В таком случае мы не хотим заставлять пользователя устанавливать хост-пакет, но, если он его всё-таки установит, нам всё ещё необходимо проследить, что установленная им версия будет совместима с нашей библиотекой.
Expand Down Expand Up @@ -307,7 +320,7 @@ NPM 7 и выше автоматически установит недостаю

Yarn подтолкнул NPM к развитию и впоследствии он тоже научился генерировать свои [npm-shrinkwrap.json](https://docs.npmjs.com/cli/v9/configuring-npm/npm-shrinkwrap-json) и [package-lock.json](https://docs.npmjs.com/cli/v9/configuring-npm/package-lock-json) файлы для реализации подобного механизма.

### `npm ci`
### Чистая установка

Чтобы добиться действительно предсказуемой установки в автоматизированных средах, важно использовать команду [npm ci](https://docs.npmjs.com/cli/v9/commands/npm-ci) вместо `npm install`.

Expand Down Expand Up @@ -424,7 +437,12 @@ PNPM в отличие от NPM и Yarn не пытается сделать с

В `node_modules` каждого пакета будут находиться только симлинки на те пакеты, которые указаны у него в `package.json`, что полностью избавляет нас от проблемы фантомных зависимостей и потребность в наличии ESLint-плагина отпадает.

В версии NPM 9 появился флаг [install-strategy](https://docs.npmjs.com/cli/v9/commands/npm-install?v=true#install-strategy), значение "linked" в нём включает подобную PNPM модель установки с симликами, но на текущий момент это экспериментальная фича.
<Aside title="Cимлинки в NPM">
В версии NPM 9 появился флаг
[install-strategy](https://docs.npmjs.com/cli/v9/commands/npm-install?v=true#install-strategy),
значение "linked" в котором включает подобную PNPM модель установки с
симликами, но на момент написания статьи это экспериментальная фича.
</Aside>

### Глобальное хранилище пакетов

Expand Down

0 comments on commit a7e00ac

Please sign in to comment.