Как стать автором
Обновить

Комментарии 65

единственным аргументом в пользу Google Fonts была быстрая и надёжная сеть доставки контента (CDN) с кэшированием.

Как по мне единственный аргумент это простота подключения. А если попытаться скачать с сайта fonts.google, то там предоставляется только ttf (хотя возможно зависит от ОС с которой качаешь), то есть с woff и woff2 уже надо как-то выкручиться, поэтому за эту ссылку отдельное спасибо

fontsqirrel и transfonter рулят, там можно по одному шрифту другие сгенерировать. а если еще хочется скорости, можно перегнать в base64

Эти сервисы могут побить шрифты или дать им неправильные настройки.
Первое дело — лезем в описание шрифта, находим ссылку на гитхаб и оттуда забираем релиз в свой проект.
Решение отключить общий CDN для всех случаев — выглядит странным. Кажется веб-сервер мог бы сам решать и инструктировать браузер можно ли использовать его ресурсы для совместного кэша со всеми последствиями.

Владельцы сетей серверов как раз решат использовать и будут юзера идентифицироввть.

Кажется это не так работает.

Есть условный CDN. Есть десяток сайтов которые грузят с него шрифты в общий кэш…

Ускорен будет только процесс загрузки шрифтов из CDN и идентифицировать получится только то, что пользователь ранее загружал с этого CDN. Владельцы конечных сайтов могли бы запрещать общий кэш (им он не нужен, они не CDN) и отследить их будет нельзя (но сами они своего юзера и так узнают, поэтому включать им пользы нет).

Для владельца CDN ничего не поменяется. Или как это должно работать?

Моё понимание проблемы:
шрифты — частный случай загружаемых ресурсов. Картинка — вполне себе ресурс.
Итак, ситуация:
Вы заходите на мой сайт. Я скриптом в невидимой части страницы пытаюсь загрузить и отрисовать некую картинку с порнхаба. Если она загрузилась чересчур быстро — значит, браузер взял её из локального кэша; следовательно, вы были на порнхабе.

Моё понимание решения:
1. По-умолчанию включаем схему описанную в статье — раздельный кэш для всех сайтов.
2. Добавляем кастомный HTTP-заголовок разрешающий совместное кэширование.
Разработчики сайтов ничего не меняют. Владельцы CDN добавляют кастомный заголовок.

Таким образом картинки с вашего сайта будут грузиться в отдельный кэш, что не позволит вычислить что вы посещали сайт. Шрифты из CDN будут грузиться из общего кэша, что позволит только узнать что вы раньше загружали эти шрифты…
Т.е. для решения данной задачи всего-то должны появиться специфичные порнхаб-шрифты, уникальные для каждой страницы? Возможно, хватит даже одного символа на страницу.
Если порнхаб специально будет использовать CDN разрешающий совместное кэширование и уникальные шрифты — то да, конечно. Но в таком случае им проще по API сразу выдавать нужные данные, зачем усложнять?

Я владелец сети сайтов, поднимаю свой CDN или "CDN" (просто сайт с расшаренным для сети ресурсами), включаю общий кэш, юзер заходит на один из моих сайтов и если фонт, картинка или ещё что, скачивается слишком быстро, то понимаю, что он не в первый раз посещает мои сайты. Можно, например, показать ему коммерческую рекламу, а если в первый раз, то рекламу остальных моих сайтов

Это можно сделать проще.

Пользователь заходит на твой сайт. У тебя стоит трекер, который ставит куки на домен трекера (так работает та же гугл аналитика, например — нет проблемы сделать свой трекер). Всё, ты его узнал и выбираешь какую рекламу показать.

Обновление не защищает от этого.

Проще-то оно проще, но палевно… А тут просто шрифты загрузились.

Если нужно скрыть, то опять же можно даже с этим патчем, если вы владелец ресурсов.

Загружаем mycdn.local/fonts/tahoma.ttf?random
CDN узнаёт пользователя и связывает random с пользователем, возвращает данные на исходный сервер.

random для удобства, можно без него — браузер отправляет достаточно уникальные заголовки с одного IP-адреса.
«Что можно сделать пользователю, чтобы не скачивать шрифты каждый раз с каждого сайта?
— Отключить загрузку сторонних шрифтов в uBlock Origin.»

Правильный ответ: не страдать фигнёй.
Хотя для начала надо будет ещё найти того пользователя, которого загрузка шрифтов напрягает. (именно пользователя — того, кто смотрит сайт, а не коммерческую компанию, борющуюся за конверсии оптимизацией своего сайта на доли процентов).
Есть такие. Необязательно шрифтов — вообще всякой фигни. Когда ради 16 кБ текста (эта страница) загружается 2 МБ всякой пурги это ещё ладно. Но когда из-за ссылки на тормозной внешний сервер страница не догружается минуту, а потом ещё, обрабатывая скрипт, смещает страницу — это не комильфо.
Это всё очень благородно, и сферические кони в вакууме дружно ржут в подтверждение ваших слов. Но я конкретно про шрифты, что даже явно указано в тексте комментария.

Можно пример со шрифтами «из-за ссылки на тормозной внешний сервер страница не догружается минуту, а потом ещё, обрабатывая скрипт, смещает страницу»?

===

Мой тезис: из-за всяких игр с отключением шрифтов, простой домашний пользователь поимеет некоторое количество потенциальных проблем, и не поимеет никакой реальной выгоды. Это как с популярными лет 10-20 назад (может, и сейчас — не слежу) программами «для супер-оптимизации Windows, потому что в MS (идиоты|злонамеренные капиталисты) сделали неоптимальные настройки, (наш супер-оптимизатор|вот эта запись в реестре) ускорит вашу систему на 300%!». Достаточно много случалось в те времена помогать пользователям, которые доприменялись подобных советов по оптимизации и теперь «а чо у меня теперь всё глючит и не работает?».
НЛО прилетело и опубликовало эту надпись здесь
Если в ближайшее обнаружу именно шрифты, тормозящие загрузку страниц, сообщу.
В целом мне не всегда понятно категорическое нежелание многих веб-дизайнеров использовать стандартные шрифты. Одно дело — благородный замысел сделать красивым и оригинальным определённый сайт с соответствующим профилем. Совсем другое дело — тулить десяток шрифтов с призрачными отличиями в начертании пары глифов по сравнению со стандартными в каждый шаблонный магазин.
Меня напрягают загрузки шрифтов: открыл сайт, блоки подтянулись, а текста нет. И ждёшь, с чистым и красивым сайтом… Или когда при отключенном JS сайта вообще нет, белая страница, хотя это уже не о шрифтах.

Так в итоге, если скачать и установить локально всё 300 МБ гугловских шрифтов, а потом отключить их загрузку через настройки браузера или блокировщика рекламы — с каким шрифтом будет показан сайт? С абстрактным Arial/Verdana? Или всё-таки подхватится нужный гугловский, раз он есть в системе?

такой вариант больше не работает из-за изменений @font-face. Если сайт использует Google Fonts, шрифты всё равно будут загружаться каждый раз заново. Локальная установка не поможет.

Теперь не поможет, так как секции local(<Имя шрифта>) теперь при подключении css шрифтов нет
Но если заблочить сам CSS-файл гуглошрифтов, то браузер и не получит @font-face, он будет знать о шрифте только название, но не указание, откуда его качать. Потому воспринимать будет, как локальный.
Не будет же. Для этого надо local(<Имя шрифта>) в css указать
Да нет же! Если в CSS нет соответствующей секции @font-face, то шрифт по умолчанию воспринимается как локальный.

Но правда, на практике это всё равно не всегда будет работать, поскольку имя шрифта в системе иногда может неочевидно трансформироваться. Например, шрифт Somefont начертание Medium может восприниматься Виндой как «Somefont Medium», а начертание Regular.
В исходники фонтмаппера заглянул бы кто-нибудь понимающий и прокомментировал логику его удивительную…
действительно, интересно было бы узнать логику такого решения, почему есть возможность скачать, но работать запрещают так, в чем смысл? если раньше так можно было, то почему теперь нельзя. хм, одни вопросы
Лично для меня главным аргументом было то, что GF определяет ОС/браузер клиента и подсовывает ему самую оптимальную версию. Здесь подразумеваются не только форматы eot/ttf/woff/woff2.

Во-первых, разбиение по unicode-диапазонам — это позволяет загружать только те куски, которые реально использованы на странице. Был довольно длинный период, когда это поддерживал только Хром — он получал свою версию CSS, все остальные свою.

Во-вторых, хинтинг. Не секрет, что браузеры рендерят шрифты по разному. Подобрать универсальные настройки конвертера на условном FontSquirrel практически невозможно — где-то будет выглядеть нормально, а где-то хуже. А вот GF может держать несколько по-разному оптимизированных версий одного и того же шрифта.

Сейчас вся эта машинерия тоже менее актуальна, но в прежние времена (IE, старая Опера, старый ФФ и пр.) — очень выручала.

Вот тоже хотел добавить — google fonts умеет это делать оптимально. Unicode-ranges для различных языков очень позитивно сказываются на скорости загрузки. Одно дело грузить 300-400 KiB на каждое начертание или срезать все не латинские\кириллические символы. И совсем другое дело автоматически подгружать нужный subset символов по 15 KiB.


Благо есть готовые утилиты под это дело и можно сделать всё это локально. Или с google fonts и взять. Но если нужно поддерживать старые браузеры, то вариативность этого дела может сильно огорчить.

Если этими шрифтами пользуются все-все-все, почему бы не включить их в состав браузеров? Оу. Уже увидел, почему. 300Мб шрифтов… Не то, что на диске, в голове не помещается.
Помимо 300МБ есть и другая проблема. Можно было бы включить эти шрифты в состав ОС, однако этого так же не происходит. Люди должны договориться — это самая сложная часть.

Не надо. У меня винда уже засрана шрифтами разными, аля китайские или индийские, мне становится жутко неудобно с ними работать, список слишком длинный в приложениях. Еще и гугловские 1000 штук… не не не, нафиг.

Да, возможно 300Мб много, но я уверен, что имеется (или можно было бы сформировать) в гугле статистика о том, какие шрифты у него выкачивают чаще всего. А там уж небось по Парето получится, что 20% шрифтов это 80% трафика. И вот эти самые 20% было бы сохранить во всех ОС вообще очень даже круто.

У Google Fonts еще есть проблема с GDPR – у них не написано, какие данные они собирают с пользователей, как используют и т.д. Точнее, написано кое-что по этому поводу в FAQ, но это не юридический документ в отличие от Privacy Policy.
НЛО прилетело и опубликовало эту надпись здесь
Было дело — надо было уменьшить вес шрифтов. Пользовался этим: https://www.fontsquirrel.com/tools/webfont-generator.
Загружаю ttf, получаю woff и woff2, и при этом если выбрать Custom Subsetting можно указать только нужные символы.
Вес — сверхлёгкий, качество — не знаю, не эксперт.

Веб-шрифты не нужны, это зло. Они замедляют показ страницы, так как текст не отображается до загрузки огромного, тяжелого шрифта. Зачем их использовать и замедлять сайт, я понять не могу. Наверно, разработчики сайтов неквалифицированные и не понимают последствия использования веб-шрифтов.


В самых популярных ОС вроде Windows достаточное количество качественных встроенных шрифтов, можно выбирать из них. Чем Roboto или Open Sans лучше, чем Arial или Calibri, я не понимаю. Для непрофессионала в мелком размере они вообще все выглядят одинаково. Вдобавок, встроенные шрифты в Windows оптимизированы под пиксельную сетку и выглядят в среднем лучше, чем "размытые" веб-шрифты без оптимизаций.


Про кроссплатформенность можно не думать, пока 90% пользуются windows. Указываем стандартный шрифт Windows, получаем быстрый сайт. Для других платформ можно либо указать шрифт-альтернативу, либо на худой конец веб-шрифт.


Есть конечно проблема, что на мобильных может не быть нужных шрифтов. Ну что же, для них тогда можно указать веб-шрифт — пусть у них страница медленно грузится. Хотя я бы лучше указал шрифт-альтернативу вроде "sans".

Как-то вы очень смело обошли стороной Android, который вообще-то популярнее чем Windows (55% по данным liveinternet)

Можно было бы создать пакет шрифтов, совместимых со стандартными Windows, не претендуя на дизайн символов, но подходящих по размерам символов, чтобы не портить форматирование страниц. Пакет можно встроить в Android, либо в браузеры, либо распространять отдельно. Пользователи смогли бы выбирать между скоростью отрисовки страницы или полным соответствием задумке веб-дизайнера. Но без поддержки Google стандартом это не станет.

Почему пользователи Android должны подстраиваться под Windows?

НЛО прилетело и опубликовало эту надпись здесь

Ну вон статистика 55% — андроид трафик. Речь не о первичности и вторичности, а о количестве людей, которым упрощаем жизнь. Ну и если нужна поддержка Гугл, то куда проще её получить на встраивание или пакетирование его щрифтов, а не из Windows


P.S. Не дождётесь, пока основным UI остаётся GUI

НЛО прилетело и опубликовало эту надпись здесь

А оно не всем и нужно, полноценное. Я вот в последнее время чаще предпочитаю что-то с телефона сделать, лёжа на кровати, а не переместить свой зад на метр за стол.


Да и грань между ограниченным устройством и неограниченным где? Сейчас больше роляют, имхо, аппаратные ресурсы и канал, чем форм-фактор

Помню, во времена, когда ретина уже появилась, но 2560х1440 ещё не вошло в массы, стандартные виндовые шрифты прекрасно рисовались, а у некоторых модных сайтов либо в сине-розовое бросались, либо ужасно рваными были (говорят, доверились убогому сглаживанию и забили на хинтинг). Плевался, в итоге сдался и взял новый монитор — глаза дороже, чем воевать со всем миром.
НЛО прилетело и опубликовало эту надпись здесь

Идите уж до конца. Зачем останавливаться на шрифтах. Нафиг CSS, и так в браузере нормальные стили по умолчанию. Чем модные кнопки лучше, чем подчёркнутые синие ссылки. (Помнится, за это Артемий Лебедев топил, что ссылка должны быть только такой, но последнее время, что-то он поутих на эту тему.)

НЛО прилетело и опубликовало эту надпись здесь
Правильно топил за ссылки.
Лучшее в кнопках то, что кнопку можно замаскировать под что угодно и заранее непонятно, что будет при нажатии (как и само нажатие), только всплывает где-то внизу: away_from_this_site_to…
Edge: вероятно, в ближайшее время
Opera: вероятно, в ближайшее время
Brave: вероятно, в ближайшее время
Vivaldi: вероятно, в ближайшее время

Очень вероятно, поскольку все chrome based
На любой сайт заходишь, а там тебя встречают транспаранты «куки? куки? куки?» И все каждый во что горазд. На пол экрана, сверху, снизу, желтые, мигающие. Сколько народу отвечает «не буду куки»? Да думаю большинство тыкает бездумно в «да» и дальше пытается отмахнутся от рекламных заставок с давно купленным холодильником, заодно нечаянно подписывается на popup сообщения с сайта.

А все почему, что какие то озабоченные в Евросоюзе решили, что надо пользователей предупреждать, что их действия могут отследить злые рекламщики. Нет, настроек в браузере недостаточно, режима инкогнито недостаточно, шапочка из фольги не греет голову.

Теперь вот доказана теоретическая возможность замерить скорость загрузки шрифтов, все, шпион спалился, коварный империализм торжествует и теперь даже в игкогнито режиме я вижу рекламу месяц назад купленного холодильника. Есть новый повод усложнить жизнь 99% балбесам которых все это вообще никак не интересует.

Это какая то нафиг дурацкая забота о шпионах, которые не знают где отключить в браузере куки и кэш. Эту проблему надо обязательно переложить на сайтосоздателей и пользователей которым абсолютно до лампочки, будет ли в рекламе показываться купленный неделю назад холодильник или в конце концов стиральная машинка.

Так это все начали сами сайтосоздатели когда стали втыкать на каждый сайт шпионские пиксели гугла.
Читаешь это, и завидуешь — все это для какого-то другого, далекого и прекрасного мира. А в жестоком embedded-мире fixed font 8x19 для кириллицы глифы приходится рисовать ручками, ручками, ручками

А в u8g2 нет такого?

Не работал с u8g2, но мне кажется, вряд ли: не слышал о LCD/OLED/etc 19 пикселей высотой. На Panelook (по-моему, наиболее полном каталоге дисплеев) есть только 16 и 20 пикселей.
Достаточно наивно было бы ожидать шрифта 19 — с русскими буквами — который не используется в панелях. Тем не менее, посмотрел u8g2 — спасибо — но не нашел требуемого.
Собственно, он мне для русификации БИОС нужен. В дефолтных глифах edk2 только английский 8х19. Проблема в том, что и в (известных мне) TTF шрифтах нет требуемых пропорций 8х19. Если бы были — все элементарно: выводим на экран алфавит на TTF требуемого размера, скриншотим, парсим BMP участками 8х19 и вуаля (если забыть об авторском праве). Я так делал со шрифтом 8x16, но получается визуально, прямо скажем, не очень: шрифт нормальный, но эти три лишних (точнее, недостающих) пикселя в строке очень заметны.
а я вот просто беру и в css указываю font: robots и он работает, это что за магия? тоесть если в windows он установлен, то он из виндовса берет?
да, если у человека не будет на устройстве шрифта и его не подгрузить, то шрифт не загрузится.

В Safari так не работает начиная с какой-то версии, тоже забанили загрузку локальных шрифтов, кроме предустановленных, чтобы нельзя было идентифицировать пользователей по набору установленных шрифтов.

как это сказать-то… накрутили грязные геи, даже анекдоты без тормозов не почитаешь.
Спасибо за статью, позже попробую

Ну кстати для тех же PWA не так уж критично — сервис воркер это всё кеширует и в итоге файлы не грузятся (во второй и далее разы) даже с родного хостинга, не то что с серверов гугла.

О шрифтах и кешировании


Теперь шрифты Google Fonts больше не кэшируются!

Шрифты как кешировались так и кешируются. Вероятно Вы хотели сказать сказать, что
Изменилась механика идентификация любого ресурса в кеше, а не только шрифтов.
Сильно упрощая — теперь кеш проекта A это только кеш проекта A, вне зависимости от того что в нем лежит. И ни один другой проект не может ничего получить из этого кеша. Раньше кеш был общим для всех.


Возможность эта была чрезвычайно полезной в то время, когда люди получали доступ к сети благодаря модемам 14400, то есть каждый лишний килобайт был причиной продолжительного ожидания.


С тех пор, как ситуация с доступом изменилась, издержки на соединение с хостом стали намного значимей, чем лишние загруженные килобайты. Именно потому, как Вы верно заметили, уже очень давно, в среде оптимизаторов, существует базовая рекомендация:
все ресурсы которые нужны вашему проекту должны загружаться от туда, куда пришел запрос


Разбор прочих несуразностей материала


Раскатить-закатить

О local


Но в последнее время Google удалила фунцию local() из @font-face в Google Fonts! То есть шрифты Google Fonts теперь не могут считываться локально, если использовать API.

Убран он был абсолютно правильно и убран был по простой причине — шрифт загружаемый извне, далеко не всегда бывает ровно тем, что лежит у пользователя локально.
Сейчас стало далеко не редкостью ситуация, когда локально можно обнаружить и Material Icons в трех версиях и Roboto и Noto, версии которых безнадежно устарели, но браузер то этого не знает. Он послушно берет локальную копию и отображает кашу на экране, которую, в рамках Google Fonts никак нельзя проконтролировать.


О справочнике Марио Ранфтль


Марио Ранфтль создал очень полезный справочник google-webfonts-helper.

Этот справочник не делает НИЧЕГО кроме того, что уже делает тот же Google Fonts. И по возможностям отличается разве что интерфейсом. При этом обладая ровно теми же проблемами что и оригинал. Первая из которых — список предлагаемого не отвечает действительности и просто является точной копией того что показывает сам Google Fonts.


Между тем Google Fonts это намного больше чем то что там отображено. Например вы до сих пор не найдете там Material Icons который там есть в 5 вариантах. И так далее и тому подобное.


О оптимизации


Это делается через подсказку preload.

Я немножко вас старше, а потому имею маломальские основания вам советовать. Никогда не подписывайтесь под документом смысла которого вы не понимаете.
Худшее что сейчас можно сделать при оптимизации проекта, это влепить неконтролируемый preload шрифтов на стадии загрузки проекта. Как впрочем и любого другого ресурса.
Вообще забудьте навсегда о существовании таких вещей как async defer pereload preconect
Если они Вам помогают, значит у проекта серьезные архитектурные проблемы. И решать их при помощи этих волшебных механизмов это тоже самое что использование подорожника для лечение гемороя.


О причинах изменения спецификации


Однако в последнее время появились идеи, как его эксплуатировать во вред людям.

Эти идеи появились и использовались ровно с того момента, как появилась спецификация на кеш. Люди работавшие над спецификацией, не были патологическими идиотами. И суть самой идеи, как раз и лежит в общем кеше. Google оттягивал свой конец так долго как мог.


Основная проблема подобных решений заключается в том, что сейчас существуют десятки других возможностей проделать тоже самое. И убивать ради закрытия одной из них, механизм, который обладал крайне полезными качествами в областях далеко за рамками загрузки шрифтов, это предел непродуманности.


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

Никого в рамках этой задачи не волнует отклик браузера. Какое то чудо в перьях не подумав ляпнуло, все стали тиражировать.
А волнует тут прежде всего возможность благодаря отсутствию запроса вообще однозначным 100% образом идентифицировать поведение пользователя в рамках подконтрольных злоумышленнику ресурсов.


Например: я Цукер Маркенберг. И у меня есть ну очень популярный сайт МордоКнига. Поскольку я не просто Цукер, но еще и денег хочу, я начинаю монетизировать трафик подсовывая людям рекламу. В том числе и перед выборами. Эффективность моей работы напрямую зависит от того, что я знаю о поведении посетителя. Но вот незадача, отовсюду полезли разного рода припоны подобной идентификации. Как мне быть? Ведь это же несправедливо, когда я в рамках своей мордокниги не могу просто так выяснить такие мелочи. В результате мне приходит в голову решение, когда я каждому посетителю на его мордокнигу, кладу картинку 0x0 пикселей. Только название картинки является хешем, с закодированной информацией. Дальше, уже дело техники сверить при посещении чувствительного к статистике ресурса, логи запросов таких изображений, с логами посетителей. И однозначным образом идентифицировать каждого из них.


В сильно упрощенной схеме это работает именно так. А не мифические замеры скорсоти ответа. Тем более что латенси может возникать по десятками причин, совсем не связанным с кешем.


Что делать


Печально, что из-за приватности приходится жертвовать производительностью и делать лишние сетевые запросы.

Не писать чепухи, а подтянуть свой уровень в этой области. Уже давно проблемы производительности в том числе с загрузкой шрифтов, решаются иными способами. Слава богу браузеры давно дали нам в распоряжение массу механизмов, о которых ранее мы могли только мечтать. Из которых возможность контролирования любого сетевого запроса на уровне woirkera первейший механизм с которым я рекомендую ознакомиться.

«Раньше кеш был общим для всех.
Возможность эта была чрезвычайно полезной в то время, когда люди получали доступ к сети благодаря модемам 14400, то есть каждый лишний килобайт был причиной продолжительного ожидания.»

Если бы шрифты загружались всегда асинхронно, то их изобилие возможно и не влияло бы на время загрузки страницы. К сожалению, это обычно не так — загрузка шрифта на многих страницах тормозит остальные загрузки, довольно заметно, к примеру — 0,7 с. Гугл раздаёт шрифты всем желающим бесплатно, но он не обещал делать это мгновенно. В результате на странице сайта безымянным веб-дизайнером накорябаны 1,5 символа прямо незаменимым шрифтом, загрузка которого тормозит отображение страницы на 0,7 с (мои 0,7 с!), и он там далеко не один. Хорошо, если не забыли указать преконнект днс.

Кстати, отрисовывать страницы pdf и ms документов бесплатно Гугл стал тоже очень медленно.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий