TGViewer
melikhov.dev melikhov.dev @melikhov_dev · 4.74K subscribers
Post #238 5.11K
Метапакеты

Часто с возрастом появляется желание иметь пакет для пакетов — положить в него всё нужное и накатывать одной командой. Чтобы он привозил и eslint, и prettier и browserslist. Вот только npm не предназначен для метапакетов. npm не гарантирует, что транзитивные зависимости будут лежать плоско на первом уровне. Вот вообще не гарантирует. А пакеты на это завязываются.
Классика — проблемы с плагинами eslint которые не могут лежать, на втором уровне. Ну ок, это кажется починили в новой системе конфигов (я ещё не попроовал).

Или вот browserslist-useragent перенёс browserslist в peerDependencies. Что это значит? Где тут проблемы метапакетов?

Предположим такую схему зависимостей:


dependencies
<метапакет>
browserslist-useragent: 4.2.2
browserslist: 4.2.2

devDependencies
webpack
browserslist: 4.1.1


Предположим у вас npm 6 или вы работаете в режиме --legacy-peer-deps. Ставим зависимости и оказываемся в ситуации


node_modules
<метапакет>
node_modules
browserslist: 4.2.2

webpack
browserslist: 4.1.1
browserslist-useragent: 4.2.2


Вроде не страшно?

А теперь делаем npm prune --production


node_modules
<метапакет>
node_modules
browserslist: 4.2.2

browserslist-useragent: 4.2.2


Всё сломалось! browserslist-useragent больше не видит browserslist и падает.

Да, если у вас npm 7 и выше и вы перешли на новую работу с peerDeps то получите


node_modules
<метапакет>
node_modules
browserslist: 4.2.2

browserslist-useragent: 4.2.2
node_modules
browserslist: 4.2.2


Может быть. А может повезёт и оно дедупнется. Гарантий нет. В этом и проблема метапакетов. Они не дают гарантий, транзитивные зависимости нельзя магически превратить в зависимости первого уровня.

Что тут можно сделать? Ну, например, написать скрипт, который контролирует версии базовых зависимостей и сам делает пул-реквесты по их поднятию. Либо остаться на мета-пакете и очень внимательно следить за структурой.
GitHub Make browserslist a peer dependency · browserslist/browserslist-useragent@ee7bb63 Fixes #73
  • 👍 22
  • ❤ 3
  • ❤‍🔥 1
More from @melikhov_dev
  1. Sep 13, 2026Какой он — личный харнес? Вот мы и пришли в точку, когда уже бизнес не устраивает медленна…
  2. Aug 30, 2026Разобрал своего питонячего новостного бота и собрал нового, уже на Гермесе. Ну как собрал…
  3. Aug 24, 2026Вы могли наверное заметить что как-то мало меня стало в последнее время. Не видно на конфе…
  4. Aug 6, 2026Как же хорошо перечитывается сейчас «Трилогия Муравейника» Гибсона (она же Sprawl trilogy)…
  5. Aug 1, 2026github показал очередную полезную штуку — Stacked pull requests. Даже жалко, что как обычн…
  6. Jul 21, 2026Жил счастливо (почти) с revdiff, но тут мне показали herdr.dev. Это такой tmux на стероида…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →