dimhold.by
← Артыкулы

Граф npm за 15 гадоў. Ён вырас да 4,45 мільёна пакетаў, а адзін акаўнт і цяпер дастае да чвэрці з іх

Ёсць карцінка npm, якая сядзіць у мяне ў галаве ўжо шмат гадоў. Гэта Software Galaxies Андрэя Кашчы: увесь рэестр, намаляваны воблакам зорак. Мне хацелася тую ж карцінку, але ў руху, кадр на год, каб убачыць, як гэтая штука расце. Яго дадзеныя па npm сканчаюцца здымкам лістапада 2020 года, таму давялося будаваць сваю.

Меркаванне ў мяне таксама было гатовае да таго, як я нешта палічыў. У 2019 годзе Цымерман з сааўтарамі напісалі, што 20 акаўнтаў мэйнтэйнераў дастаюць больш чым да паловы npm. Я заўсёды адносіў гэта да гадоў left-pad. З таго часу рэестр вырас з менш чым мільёна пакетаў прыкладна да 4,5 мільёна і я меркаваў, што ўлада расплылася разам з ім. Я ні разу гэтага не правяраў, мне проста падабалася, як гэта гучыць.

Як я лічыў

8 кастрычніка 2026 года эндпойнт рэплікацыі рэестра аддаў 4465309 імёнаў пакетаў. Спампаваць усе было нерэальна, таму я ўзяў выпадковую выбарку з 30000 імёнаў і спампаваў іх поўныя дакументы. На кожны год з 2011 па 2026 я браў найвышэйшую версію, якая існавала на 31 снежня гэтага года і яе dependencies. 2026 год абрэзаны пачаткам 8 кастрычніка. Далей я ішоў па гэтых залежнасцях уніз, пакуль недапампаваных не засталося. Урэшце спатрэбілася 98736 дакументаў пакетаў.

Для кожнага ліку ніжэй важныя такія правілы. Пакет існуе ў годзе, калі ў яго ёсць версія з датай да зрэзу. Рабро гэта адзін радок у dependencies гэтай версіі, без dev і peer залежнасцяў. Лікі для ўсяго рэестра гэта выбарка, памножаная на 4465309 / 30000. Сам падлік напісаны на голым Python 3.12. Раскладку гіфкі рабіў networkx 3.6, маляваў matplotlib 3.11, сціскаў gifsicle 1.94.

Перш чым гэтаму верыць, я параўнаў са старымі артыкуламі. У Цымермана было 1,3 прамой залежнасці на пакет у 2011 годзе і 2,8 у 2018, у мяне 1,26 і 2,91. У артыкуле Робінсана з сааўтарамі 2026 года ў 61,3 працэнта пакетаў ёсць хаця б 1 залежнасць, у мяне 60,7. Дастаткова блізка, каб ісці далей.

Аніміраваны граф выпадковай выбаркі пакетаў npm, кадр на год з 2011 па 8 кастрычніка 2026. Зялёныя кропкі гэта пакеты з залежнасцямі, шэрыя ў знешнім кальцы пакеты без іх, аранжавыя кружкі 400 найбольш ужывальных пакетаў, сінія лініі рэбры да іх. Цэнтр вырастае з некалькіх кропак у шчыльнае воблака вакол lodash, chalk, react і axios, а ў 2024 годзе справа ўнізе з'яўляецца асобнае скопішча спаму. Лічыльнік ідзе ад прыкладна 2800 пакетаў да 4,45 мільёна, а доля, да якой дастае першы акаўнт, ад 16 да 25 працэнтаў.
Кадр на год са станам на 31 снежня, апошні на 8 кастрычніка 2026 года. Кропкі гэта выбарка, лікі ў куце пералічаныя на ўвесь рэестр.

Вузлы і рэбры

На канец 2011 года выбарка дае каля 2800 пакетаў і 3600 рэбраў. На 8 кастрычніка 2026 года гэта 4,45 мільёна пакетаў і 19,4 мільёна рэбраў. Да 2024 года рэбры кожны год растуць хутчэй за вузлы, гэта бачылі яшчэ Кікас з сааўтарамі ў 2017 годзе. У 2025 і 2026 гадах наадварот.

пакеты npm і рэбры залежнасцяў на канец кожнага года, лагарыфмічная шкала 1 тыс. 10 тыс. 100 тыс. 1 млн 10 млн 100 млн 3572 2828 2,44 млн 838 тыс. 8,12 млн 2,51 млн 16,1 млн 19,4 млн 4,45 млн 2024: рэбраў удвая больш рэбры пакеты 2011 2014 2017 2020 2023 2026
Ацэнка на ўвесь рэестр: лік па выбарцы, памножаны на 4465309 / 30000. 2026 год абрэзаны пачаткам 8 кастрычніка. Раннія гады стаяць на нямногіх пакетах выбаркі: 19 у 2011 годзе і 104 у 2012.

Потым настаў 2024 год і я падумаў, што ў мяне баг. Рэбраў за 1 год стала ўдвая больш, з 8,1 мільёна да 16,1 мільёна, а пакетаў на 28 працэнтаў. Сярэдняя колькасць залежнасцяў скокнула з 3,24 да 5,02.

Гэта быў не баг. Пакетаў, створаных у 2024 годзе, у выбарцы 4724 і на іх прыпадае 53391 рабро, гэта значыць 41 працэнт усіх рэбраў 2026 года. У 431 з іх 20 і больш залежнасцяў і 81 працэнт іх рэбраў вядзе да іншых пакетаў, створаных у 2024 годзе ці пазней. Пакеты, на якія яны спасылаюцца, называюцца накшталт gain-pleasant-prepare і anywhere-dream. Я адкрыў тарболы гэтых 431, прачытаць атрымалася 430. У 52 ляжыць tea.yaml, файл пратакола ўзнагарод tea.xyz. Сярод 1376 пакетаў, створаных у 2023 годзе і з хаця б 1 залежнасцю, такіх не знайшлося ніводнага. Значыць, частка гэтага накрутка дзеля ўзнагарод таго пратакола, а астатняе я растлумачыць не магу.

Знайшоў я іх непрыемным спосабам. Дапампоўка замыкання не сканчалася. Праход за праходам не хапала ад 16 да 18 імёнаў, бо cadutdudut_128 залежыць ад cadutdudut_127, той ад cadutdudut_126 і гэтак далей. Я спыніўся на 15 няспампаваных імёнах. 11 з іх гэта наступнае звяно такога пранумараванага ланцужка, астатнія 4 вісяць на пакетах тых жа месяцаў, з сакавіка па май 2024 года. Яны крыху мяняюць памеры замыканняў спаму і больш нічога.

Хто трымае граф

Спачатку прамыя рэбры. У 2015 годзе 100 найбольш ужывальных пакетаў атрымлівалі 43 працэнты ўсіх рэбраў выбаркі. У 2018 годзе было 34 працэнты, у 2023 годзе 28, у 2026 годзе 20. Частку апошняга падзення даў спам 2024 года, бо яго рэбры вядуць адно да аднаго. І ўсё ж па гэтай меры маё меркаванне пацвердзілася і граф расплыўся.

Потым транзітыўная карціна, а яна і важная, калі акаўнт скрадуць. Для кожнага пакета выбаркі я ўзяў усе пакеты, якія ён падцягвае праз залежнасці і ўсе акаўнты са спіса мэйнтэйнераў гэтых версій. Потым спытаў, да колькіх пакетаў дастае кожны акаўнт.

наколькі граф сканцэнтраваны, працэнты рэбры да 100 найбольш ужывальных пакетаў пакеты, да якіх дастае першы акаўнт 0% 20% 40% 60% 43% 34% 28% 20% 35% substack 33% isaacs 25% sindresorhus 2014 2016 2018 2020 2022 2024 2026
Ахоп акаўнта гэта колькасць пакетаў, якія праз залежнасці падцягваюць версію, дзе гэты акаўнт ёсць у спісе мэйнтэйнераў. Дзелім на ўсе пакеты, разам з 39 працэнтамі без залежнасцяў.

Першы акаўнт даставаў да 35 працэнтаў усіх пакетаў у 2015 годзе (substack), да 33 працэнтаў у 2018 (isaacs) і да 25 працэнтаў у 2026 (sindresorhus). Усе пакеты тут значыць разам з 39 працэнтамі, у якіх залежнасцяў няма зусім і да якіх не дастане ніхто. Сярод пакетаў хаця б з 1 залежнасцю з 2021 года кожны год хапае 2 акаўнтаў на палову з іх.

Колькі акаўнтаў дастаюць да паловы ўсяго, у тым жа прагным парадку, што ў Цымермана: 11 у 2018 годзе і 17 у 2026. Я б не верыў гэтым лікам да адзінкі. Калі я разбіў выбарку на 2 паловы, выйшла 10 і 12 для 2018 года і 14 і 19 для 2026, так што сумленны адказ на сёння “ад 14 да 19”. Доля першага акаўнта ўстойлівая, 25,0 і 25,5 працэнта на дзвюх паловах.

Мой падлік не супадае з іхнім. Яны бралі ўвесь рэестр да красавіка 2018 года, я выбарку і найвышэйшую версію кожнага пакета. Мае 11 за 2018 год супраць іхніх 20 могуць тлумачыцца гэтай розніцай і больш я б у гэта не ўчытваўся.

Такім чынам, з 2015 года доля 100 галоўных пакетаў у прамых рэбрах упала ўдвая, а ахоп першага акаўнта знізіўся ўсяго з 35 да 25 працэнтаў. Чвэрць npm і цяпер залежыць ад аднаго акаўнта. Некаторыя з 17 акаўнтаў зусім не людзі: types стаіць амаль за кожным пакетам @types, а react-bot, мяркуючы па імені, рэлізны бот React.

Чаго я не правяраў

  • “Мэйнтэйнер” тут гэта спіс у дакуменце версіі. Наяўнасць у спісе нічога не кажа пра тое, хто публікуе, у каго ўключана 2FA і хто перайшоў на trusted publishing.
  • Знятых і выдаленых пакетаў у рэестры сёння няма, таму раннія гады заніжаныя. Наколькі, я не ведаю.
  • Адна версія на пакет на год, без развязання дыяпазону бацькі. Сапраўдная ўсталёўка можа падцягнуць іншую версію з іншымі залежнасцямі.
  • Адна выпадковая выбарка, адзін прагон. Раннія гады стаяць на вельмі нямногіх пакетах, 104 у 2012 годзе і 754 у 2014, таму з іх я б не вычытваў нічога, акрамя трэнду.

Я так і не зразумеў, што рабіць з гэтымі акаўнтамі, якіх ад 14 да 19. Большасць з іх людзі, якія нічога дрэннага не зрабілі: яны рана напісалі маленькія пакеты і ад іх цяпер залежаць усе.