Ёсць карцінка 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. Дастаткова блізка, каб ісці далей.
Вузлы і рэбры
На канец 2011 года выбарка дае каля 2800 пакетаў і 3600 рэбраў. На 8 кастрычніка 2026 года гэта 4,45 мільёна пакетаў і 19,4 мільёна рэбраў. Да 2024 года рэбры кожны год растуць хутчэй за вузлы, гэта бачылі яшчэ Кікас з сааўтарамі ў 2017 годзе. У 2025 і 2026 гадах наадварот.
Потым настаў 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 года, бо яго рэбры вядуць адно да аднаго. І ўсё ж па гэтай меры маё меркаванне пацвердзілася і граф расплыўся.
Потым транзітыўная карціна, а яна і важная, калі акаўнт скрадуць. Для кожнага пакета выбаркі я ўзяў усе пакеты, якія ён падцягвае праз залежнасці і ўсе акаўнты са спіса мэйнтэйнераў гэтых версій. Потым спытаў, да колькіх пакетаў дастае кожны акаўнт.
Першы акаўнт даставаў да 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. Большасць з іх людзі, якія нічога дрэннага не зрабілі: яны рана напісалі маленькія пакеты і ад іх цяпер залежаць усе.