Каждый спор про размер бандла, в котором я участвовал, заканчивался тем, что кто-то выкладывал график веса страницы из HTTP Archive. Линия идёт вверх и спор окончен. Я сам выкладывал его не раз. В голове у меня рост был про картинки: большие фото для больших экранов. JavaScript был тем, на что мы жаловались между делом.
Как эта линия получается, я ни разу не читал. В этот раз мне захотелось гифку за 15 лет, пришлось прочитать.
Как я считал
HTTP Archive выкладывает ряд в JSON на cdn.httparchive.org/reports/. На 8 октября 2026 года последний обход там от 1 сентября. Прежде чем брать хоть одно число, я прочитал SQL, который собирает эти файлы, в их репозитории dataform. Считаются только главные страницы, 1 КБ это 1024 байта. Медиана для картинок или JavaScript берётся только по страницам, где этот тип есть, поэтому части не складываются в целую страницу.
Я взял ряд десктопа и июльский обход каждого года. Считал на Python 3.12, гифка нарисована в matplotlib 3.11 и сжата gifsicle 1.94.
Что выросло
В июле 2011 года медианная главная страница десктопа весила 540 КБ, в июле 2026 года 3009 КБ, в 5,6 раза больше. Картинки выросли с 269 до 1062 КБ, JavaScript с 109 до 767 КБ, в 7 раз. Запросов почти столько же, было 64, стало 76, то есть потяжелели сами файлы.
Моя картина оказалась верной наполовину. Картинки по-прежнему самая большая часть, но их линия на гифке останавливается. С июля 2019 по июль 2026 года медианный вес картинок вырос с 987 до 1062 КБ, на 8 процентов за 7 лет, а JavaScript за те же годы почти удвоился.
Лето, когда веб похудел
Первое, что я заметил в кадрах, это провал. 15 июня 2018 года медианная страница весила 1709 КБ, а 1 июля 1503 КБ, картинки упали с 864 до 650 КБ. Я довольно долго искал, что случилось с вебом в тот месяц и ничего не нашёл.
У HTTP Archive есть журнал изменений. 1 июля 2018 года обход перешёл на 1,3 миллиона адресов из Chrome UX Report. Число адресов в данных выросло с 461 тысячи до 1,28 миллиона. 15 декабря 2018 года список синхронизировали со всем отчётом, это 3,84 миллиона страниц. Медиана выросла на 17 процентов за 1 обход, картинки на 41 процент.
По всем 281 обходам десктопа медианное изменение между 2 соседними обходами 0,89 процента. Эти ступеньки больше в 14–19 раз. В 2017 году есть ещё 2 такого же размера. 1 мая тестовые агенты переехали на Linux и медиана упала на 13 процентов. 1 августа она выросла на 15 процентов, а записи в журнале нет. Один только HTML упал с 29 до 14 КБ в мае и вернулся к 28 КБ в августе. Думаю, дело в замере: страницы не теряют половину своего HTML на 3 месяца. Стив Саудерс писал о том, как смена методики гнёт этот ряд, ещё в 2013 году, я нашёл только более поздние случаи.
Список рос и дальше, до 13,2 миллиона главных страниц в марте 2025 года, в сентябрьском обходе их 11,4 миллиона. Срезы по рангу есть с мая 2021 года и я проверил, не объясняется ли недавний рост просто другой выборкой. 1000 самых посещаемых сайтов за эти 5 лет выросли с 1704 до 2843 КБ, быстрее, чем весь список.
Куда делись картинки
В июле 2017 года медианная главная страница делала 41 запрос картинок, в июле 2026 года 19. За те же годы доля страниц, где хотя бы у одной картинки стоит loading="lazy", выросла с 0 до 42,5 процента.
Ленивые картинки грузятся, когда оказываются рядом с окном, поэтому я проверил окно. Конфигурация обхода в HTTPArchive/crawl открывает страницы десктопа в окне 1920 на 1080, а мобильные в 360 на 512. Шага прокрутки я не нашёл ни там, ни в их форке wptagent. Пэт Минан, автор WebPageTest, отвечал на тот же вопрос на форуме HTTP Archive в апреле 2021 года. Ленивые картинки вне окна не грузятся, значит не измеряются. Он назвал это точным для первой загрузки. В той же ветке он написал, что до того месяца окно десктопа было 1024 на 768, так что в 2019 году в окно попадало ещё меньше страницы.
Точно для первой загрузки, с этим я согласен, но это не тот вес, который я имел в виду, когда выкладывал график. Web Almanac 2021 года предположил, что запросов картинок стало меньше из-за ленивой загрузки, но замера не приводил. Я не нашёл никого, кто посчитал бы байты ниже первого экрана.
Мой прогон
Мой краулер это Playwright 1.64 на Node 22 с Chromium 156. Для каждого сайта он открывает чистый контекст с выключенным кешем и окном 1920 на 1080. Загружает главную страницу и ждёт 2 секунды тишины в сети, не больше 30 секунд. Это то, что увидел бы краулер без прокрутки. Потом 10 секунд стоит на месте, это контроль. Потом прокручивает до низа шагами по 80 процентов окна каждые 400 мс и снова ждёт. Считаются байты, переданные по сети.
Сайты это 300 случайных доменов из миллиона Tranco (seed 699). Загрузились 185, из них 167 весили хотя бы 100 КБ, так отсекаются припаркованные домены. У 45 процентов из них есть ленивая картинка, близко к 44,6 процента, которые HTTP Archive даёт за сентябрь.
До прогона я записал, что меня опровергнет. Медианная страница прибавляет от прокрутки меньше 3 процентов, медианная страница с ленивыми картинками меньше 5. Вышло и то и другое, 0,1 и 4,1 процента. 43 процента страниц не догрузили ни байта. Стояние на месте добавило 1,5 процента всех байт. Прокрутка добавила 12,6.
Но график показывает медианную страницу, а не медианную прибавку. Медиана всей моей выборки после прокрутки сдвинулась с 2943 до 3568 КБ, на 21 процент. Картинки выросли с 1187 до 1647 КБ. Я довольно долго искал баг в своём скрипте. Страницы с ленивыми картинками тяжелее: медиана 3901 КБ против 2352 КБ у остальных. 8 из 83 страниц, которые были ниже медианы, после прокрутки оказались выше неё. Эту вторую меру я выбрал уже после прогона, поэтому доверяю ей меньше. На 167 страницах 95-процентный доверительный интервал по бутстрэпу широкий: от 7 до 40 процентов для страницы, от 12 до 77 для картинок.
Потом я прогнал первые 200 тех же доменов в режиме телефона, 360 на 512 при плотности пикселей 3. Засчитано 120 страниц. Медианная страница с ленивыми картинками прибавила 11,7 процента, выше моего порога. Треть всех страниц прибавила 10 процентов и больше. Медиана выборки сдвинулась с 2915 до 3806 КБ, на 31 процент, интервал от 5 до 62 процентов. Web Almanac 2022 года предположил, что на телефонах картинок меньше, чем на десктопе, потому что ленивая загрузка не срабатывает на маленьком первом экране. Мой прогон на телефоне с этой догадкой сходится.
Большая часть байт, пришедших при прокрутке, это картинки: 75 процентов на десктопе и 71 на телефоне. Объясняет ли это то, что линия картинок перестала расти, сказать не могу. Мой прогон это один день в 2026 году, а в 2019 году ленивую загрузку делали в основном на JavaScript. Повторить это сейчас нельзя.
Чего я не проверял
- Моя выборка это домены Tranco, а не список CrUX, который берёт HTTP Archive. По одному прогону на страницу с одного сервера.
- Примерно треть страниц десктопа так и не затихла до прокрутки, поэтому часть их байт при прокрутке может быть фоновым трафиком. В сумме прокрутка принесла в 8 с лишним раз больше байт, чем контрольная фаза, но для отдельной страницы разделить их я не могу.
- HTTP Archive публикует ещё оценку Lighthouse для байт картинок за пределами экрана. Со своими числами я её не сравнивал.