dimhold.by
← Статьи

Почти половина скачиваний самых популярных пакетов npm приходится на пакеты с одним мейнтейнером. Я посмотрел, кто им платит

В январе автор colors и faker сломал оба пакета намеренно. faker 6.6.6 вышел без кода, а colors начал бесконечно печатать “LIBERTY LIBERTY LIBERTY”. Это задело всех, у кого установка подтянула новую версию. Ещё в ноябре 2020 года он написал на GitHub, что бесплатной работы от него больше не будет. В тредах, которые я прочитал, спорили в основном о том, имел ли он на это право. У меня был другой вопрос и ответа на него не было. Кто поддерживает пакеты в моей папке node_modules и платит ли им кто-нибудь?

С версии 6.13 в 2019 году npm после установки печатает “N packages are looking for funding”. Я всегда пролистывал эту строку. Поэтому решил посчитать, пока год не кончился.

Что я взял

Список я взял из npm-high-impact 1.1.0 от ноября 2022 года. Его автор собрал пакеты, которые подходят под определение high impact из npm. Я взял из него часть с миллионом скачиваний в неделю и больше, это 4366 пакетов. Для каждого взял самую новую стабильную версию, опубликованную до 28 декабря 2022 года. Из этой версии я взял аккаунты npm с правом её публиковать и README из её тарбола. Так что README показывает то, что авторы писали в этом году. Скачивания я брал из API npm за период с 1 января по 27 декабря 2022 года. Для 4 пакетов с именами из 2 букв (yn, pn, rx, is) API отдаёт ноль. Осталось 4362, вместе у них 2,0 триллиона скачиваний.

До первого числа я записал, чего жду. Больше половины скачиваний дают пакеты с 1 или 2 мейнтейнерами. Меньше трети пакетов просят денег. А на Open Collective, где деньги, полученные проектом, видны публично, выходит меньше 1 доллара на миллион скачиваний.

Кто их держит

У медианного пакета в списке 2 мейнтейнера. Ровно 1 мейнтейнер у 2086 пакетов, это 48% списка. На них приходится 47% всех скачиваний. Пакеты с 1 или 2 мейнтейнерами дают 65% скачиваний, так что первое ожидание подтвердилось.

1 мейнтейнер 47% 48% 2 17% 18% от 3 до 5 25% 23% 6 и больше 10% 11% доля скачиваний доля пакетов
Скачивания с 1 января по 27 декабря 2022 года, вместе 2,0 триллиона. Аккаунт не всегда один человек.

Потом я считал аккаунты, а не пакеты. Выбирал их жадно: сначала аккаунт, пакеты которого дают больше всего скачиваний, потом тот, который добавляет больше всего новых скачиваний и так далее. Пакет считается покрытым, когда выбран хотя бы один из его мейнтейнеров. 3 аккаунта покрывают четверть всех скачиваний, а 12 аккаунтов хватает на половину. Один аккаунт, sindresorhus, числится мейнтейнером у 274 пакетов с 14% всех скачиваний. На 222 из них он единственный. Среди них has-flag и find-up.

Аккаунт npm это не человек. 170 пакетов с 1 мейнтейнером принадлежат “types”, боту, который публикует DefinitelyTyped. “fb” публикует пакеты React и Jest. Медианному пакету с 1 мейнтейнером 7 лет. 1579 таких пакетов старше 5 лет. Как минимум у 460 из этих старых пакетов в этом году вышла новая версия.

Что они пишут

У 731 пакета в package.json есть поле funding. Именно его читают npm fund и строка после установки. Вместе со ссылками на спонсорство в README выходит 812 пакетов, 19% списка и 26% скачиваний. Второе ожидание подтвердилось. Чаще всего ссылаются на GitHub Sponsors, это 478 пакетов, на Open Collective 302. Ещё 205 README упоминают подписку Tidelift. Tidelift продаёт компаниям подписку, поэтому просьбой о деньгах я её не считал.

Я искал в README слова о людях, которые стоят за кодом: volunteers, free time, spare time, hobby project, not backed by a company. Мой список слов нашёл 13 пакетов из 4362. Когда я прочитал другие README, увидел, что список часть пропускает. ioredis, например, пишет, что открытый код это тяжело и отнимает много времени. Так что их не меньше 13 из 4362. Вот некоторые.

core-js, 2,1 миллиарда скачиваний в этом году, один мейнтейнер. Над текстом стоит заголовок “As advertising: the author is looking for a good job”, а дальше:

core-js isn’t backed by a company, so the future of this project depends on you.

webpack:

Most of the core team members, webpack contributors and contributors in the ecosystem do this open source work in their free time.

msw, созданный в 2018 году, 61 миллион скачиваний:

Despite that, this library remains a hobby project maintained in spare time

В том же предложении сказано, что проект не может оплатить даже одному контрибьютору работу на полную ставку.

У core-js есть ещё скрипт postinstall, который печатает ту же просьбу в терминал. Я поставил пакет через npm 6.14 и просьба появилась. Через npm 8.19 её не было, потому что npm 7 и новее прячут вывод скриптов установки. Строку про funding напечатали оба.

Сколько денег видно

Open Collective публикует бухгалтерию каждого коллектива. Я спросил у его API, сколько получил в 2022 году каждый коллектив, на который ссылаются эти пакеты.

Первая сумма вышла почти в 2 миллиона долларов и выглядела слишком хорошо. Потом я увидел в списке airbnb с 200 000 и salesforce с 44 000. Это фонды, которые дают деньги. Их логотипы стоят в списке спонсоров в README eslint, а моя регулярка брала любую ссылку на Open Collective. Я оставил только аккаунты с типом COLLECTIVE и убрал 3 ссылки, которые указывают на чужой проект в примере. После этого вышло 1,65 миллиона долларов на 75 коллективов. На них ссылаются 286 пакетов с 5% всех скачиваний.

Это 16 долларов на миллион скачиваний. Я ждал меньше 1, так что здесь ошибся больше чем в 10 раз.

$0 $100 000 $200 000 получено долларов в 2022 первые 5: 53% всего babel, eslint, socketio, webpack, nest core-js $11 377 нижние 38 вместе: $23 824
Только аккаунты типа коллектив. Фонды и компании из списков спонсоров не считаются.

5 крупнейших коллективов (babel, eslint, socketio, webpack, nest) получили 53% денег. 38 самых маленьких вместе получили 23 824 доллара за весь год, а 25 коллективов получили меньше 1000 долларов каждый. Коллектив core-js получил 11 377 долларов. На него ссылаются 3 пакета, у которых вместе 3,8 миллиарда скачиваний. Это около 3 долларов на миллион.

Пакетов с 1 мейнтейнером на этой картине почти нет. Только 3% их скачиваний приходится на пакеты, которые ссылаются хоть на какой-то коллектив. Денег вообще просят 481 из 2086, из них 386 через GitHub Sponsors. GitHub Sponsors суммы не публикует, поэтому для этих пакетов числа у меня нет.

Что я не проверял

Деньги от работодателей. Некоторым мейнтейнерам за эту работу платит работодатель. Например, команда npm CLI в GitHub: её аккаунты darcyclarke и nlf тоже есть в списке. npm такие деньги не показывает, а в README упоминаний о них я не искал.

Суммы на GitHub Sponsors и Patreon не публичны, я считал только ссылки. Скачивания включают CI и зеркала, это не люди. Деньги коллектива идут на весь проект. Я делил их только на скачивания пакетов из моего списка, которые на него ссылаются, поэтому доллары на скачивание скорее завышены. MUI в сумму не попал: его README ссылается на адрес, который API не распознал.