Файлы шрифтов с «subset» в имени — subset-Montserrat-Regular.woff2 и подобные — кочуют из темы в тему с уверенностью, что они уже урезаны. Они действительно урезаны, но не под ваш сайт: это нарезка Google под латиницу, расширенную латиницу и кириллицу. Внутри 1092 символа, из них 247 — вьетнамские. Русскоязычному сайту нужно около трёхсот.

Это шестнадцатая часть цикла «PageSpeed без мифов». В пятнадцатой мы разобрали, как прелоад тянет в окно первой отрисовки лишние начертания. Теперь — как сделать легче сами файлы.

Сколько это весит

Каждое начертание такого «subset» — 45–46 КБ. Страница с семью-девятью начертаниями тянет 300–400 КБ шрифтов, и часть из них — в окне первой отрисовки. По формуле из второй части каждые 100 КБ там — это полсекунды к модельному LCP.

Проверить свои файлы — пять строк на Python с библиотекой fontTools:

# сколько символов в шрифте — если больше ~400, файл не урезан под сайт
from fontTools.ttLib import TTFont
import glob
for f in sorted(glob.glob("fonts/**/*.woff2", recursive=True)):
    print(len(TTFont(f).getBestCmap()), "символов", f)

Как резать

Та же fontTools умеет делать настоящий сабсет: оставить только нужные символы и сразу сохранить в woff2.

pip install fonttools brotli

python -m fontTools.subset Montserrat-Regular.ttf \
  --unicodes="U+0020-007E,U+00A0-00FF,U+0400-045F,U+0490-0491,U+2010-2027,U+2030-203A,U+20AC,U+20BD,U+2116,U+2122,U+2190-2193" \
  --flavor=woff2 --output-file=Montserrat-Regular.woff2

Диапазоны выше — базовая латиница с пунктуацией, Latin-1 (кавычки «», неразрывный пробел, ©, °), кириллица с Ґ, типографские тире и многоточие, ‰, евро и рубль, №, ™ и стрелки. Для большинства русскоязычных сайтов этого хватает, но лучше собрать набор по своему контенту — об этом следующая часть.

Две настройки, которые легко испортить. Не добавляйте --layout-features=*: файл выходит в полтора раза толще (40 КБ против 26), а нужные лигатуры и кернинг сабсеттер и так оставляет. И не отключайте хинтинг ради экономии: Chrome на Windows им пользуется, а для некоторых шрифтов хинты — до 10 КБ, без которых текст рендерится заметно хуже.

Исходники держите отдельно (например, в папке _source), а урезанные файлы кладите под теми же именами, что были, — тогда стили менять не придётся.

Результаты на разных сайтах

ЧтоДоПосле
одно начертание Montserrat45–46 КБ19–20 КБ
все шрифты сайта467 КБ251 КБ
шрифты главной страницы333 КБ172 КБ
шрифты из TTF другого сайта500 КБ107 КБ (woff2)
акцентный шрифт Intro (otf → woff2)85 КБ25 КБ
наши замеры на нескольких рабочих сайтах

Как убедиться, что ничего не потеряли

  1. Символы. Сравните набор символов, которые встречаются на сайте, с картой символов урезанного файла: недостающих должно быть ноль. Как собрать набор со всего сайта — в следующей части.
  2. Картинка. Снимите скриншоты первых экранов до и после и сравните попиксельно. На одном из сайтов шесть экранов — ноль отличий.

Если символа нет в урезанном шрифте, браузер не покажет «квадратик» — он нарисует этот символ запасным шрифтом. На глаз это видно как «чужая» буква или знак другой толщины. Поэтому проверка по набору символов важнее, чем кажется.

А если шрифт подключён с Google Fonts?

Google сам отдаёт файлы по диапазонам (unicode-range), и браузер качает только нужные. Но вы не контролируете ни набор, ни прелоад, ни сервер. Для скорости обычно выгоднее скачать нужные начертания, урезать и отдавать со своего сервера.

Можно ли урезать переменный (variable) шрифт?

Да, той же командой: fontTools сохраняет оси вариативности. Можно даже зафиксировать ненужные оси, чтобы файл стал ещё легче, — но это уже отдельная настройка.

Хотите, чтобы шрифты весили втрое меньше?

Пришлите адрес — проверю шрифты на сайте и сделаю сабсет под ваш контент.

· полезно?
АЧ
Алексей Чикун веб-разработчик, команда TRIOHEAD

Делаю сайты и сервисы целиком: от вёрстки до сервера. Пишу о том, что проверил на своих проектах.

Комментарии

// загружаю комментарии…

Комментарии публикуются после проверки. Ссылки и HTML не принимаются.