# Понедельник 21 твит
Всем привет! Меня зовут Ирина @ierhyna, я фронтенд-разработчик в Semrush. Последние полтора года занимаюсь улучшени… twitter.com/i/web/status/1…
10:19@jsunderhood @ierhyna performance очень круто и сложно, нужно много времени, чтобы погрузиться и разобраться, уж то… twitter.com/i/web/status/1…
Я считаю, что хороший разработчик должен знать best practices по веб-производительности, ведь разработка это не тол… twitter.com/i/web/status/1…
@jsunderhood @ierhyna performance очень круто и сложно, нужно много времени, чтобы погрузиться и разобраться, уж то… twitter.com/i/web/status/1…
11:03
Давайте для начала познакомимся, сегодня расскажу немного о себе и своём пути в разработке.
13:33Наверно как и многие, я увлеклась программированием ещё в школе. К сожалению, не благодаря, а скорее вопреки школьн… twitter.com/i/web/status/1…
15:03Тут надо пояснить, что я росла в маленьком посёлке в Ханты-Мансийском округе, и о такой профессии, как "программист", там никто не слышал.
15:17Примерно в 2001 году дома появился компьютер и интернет. Но он был медленным и с поминутной оплатой, поэтому единст… twitter.com/i/web/status/1…
16:05Моим любимым развлечением стало открывать сохраненные страницы в Блокноте, что-то там менять, открывать в IE, и смотреть, что произошло.
16:06Потом я нашла самоучитель HTML с сайта "постройка-ру", и понеслось :) Сделала страничку про наш класс, сайт про Гар… twitter.com/i/web/status/1…
16:32Но когда возник вопрос, на какой факультет я буду поступать, мысли про IT даже не возникло. Сайты делать? Да кто же… twitter.com/i/web/status/1…
16:32Учиться было сложно ("прочитайте 600 страниц к семинару на завтра", и так по всем предметам), а временами даже физи… twitter.com/i/web/status/1…
17:02На третьем курсе преподаватели узнали о том, что я умею делать сайты, и меня стали привлекать к работе над грантами… twitter.com/i/web/status/1…
17:17Вдохновившись этим успехом, летом после 3го курса мы с приятелями основали свою веб-студию, чтобы делать сайты-визи… twitter.com/i/web/status/1…
17:37Бизнес не взлетел, и через год мы закрылись. В 20 лет это было просто, походы в налоговую казались приключением, а… twitter.com/i/web/status/1…
18:50Я поняла, что мне больше нравится делать что-то самой, чем организовывать работу людей. И с 2012 года стала занимат… twitter.com/i/web/status/1…
19:04В таком режиме прошло три года, я работала в разных местах якобы по специальности, а по ночам фрилансила. И однажды… twitter.com/i/web/status/1…
19:21Сейчас понимаю, что явно себя недооценивала: я имела опыт в open source, умела использовать git, настраивать деплой… twitter.com/i/web/status/1…
19:27Кстати, та фирма заплатила мне за тестовое задание!
19:29Но через полгода основатели поругались, и фирма закрылась 😅 Решив, что со стартапами покончено, я устроилась в Data… twitter.com/i/web/status/1…
19:47Кстати, про DataArt я узнала благодаря этому андерхуду. Пришла на собес, а там @suevalov, который вёл неделю. И я с… twitter.com/i/web/status/1…
19:50А потом я устала от аутсорса. Захотелось погрузиться в продуктовую разработку и видеть, как твои решения влияют на… twitter.com/i/web/status/1…
20:02С этими мыслями я пришла в Semrush, где работаю чуть больше 2,5 лет. Сначала я занималась фронтом в только своей ко… twitter.com/i/web/status/1…
20:12# Вторник 37 твитов
Доброе утро! В ближайшие три дня планирую рассказать:
8:12Давайте проведём несколько опросов, чтобы я лучше понимала, о чем именно и насколько подробно писать :)
8:27Занимаются ли в вашей компании веб-производительностью?
8:33Если вам скажут, что ваше приложение/сайт медленный, знаете ли вы, как это проверить?
8:37Занимаются ли в вашей компании веб-производительностью?8:40
Если вам скажут, что ваше приложение/сайт медленный, знаете ли вы, как это проверить?8:40
Если нужно сделать ваше приложение/сайт быстрее, знаете ли, как можно это сделать?
8:48Если нужно сделать ваше приложение/сайт быстрее, знаете ли, как можно это сделать?8:48
Первая тема — о метриках web performance. Как замерить, насколько приложение быстрое, какие для этого существуют метрики и инструменты.
13:17Пожалуй, самый известный инструмент для отслеживания веб-производительности, это Lighthouse. Я надеюсь, что о нём в… twitter.com/i/web/status/1…
13:17Однако на результат может повлиять конфигурация вашего компьютера, поэтому лучше запускать проверки в изолированном… twitter.com/i/web/status/1…
13:17Получить более подробные данные, на изолированном окружении, можно через Web Page Test. Он позволяет сравнивать рез… twitter.com/i/web/status/1…
13:17На основе Web Page Test работают многие другие инструменты, например, Speedcurve speedcurve.com, который м… twitter.com/i/web/status/1…
13:19Но Speedcurve, в отличие от Web Page Test, платный.
13:19@jsunderhood Lighthouse измеряет только скорость загрузки страницы, практически ничего не говорит о возможной скоро… twitter.com/i/web/status/1…
Для отслеживания скорости переключения между страницами и взаимодействия, например, когда по действию что-то появл… twitter.com/i/web/status/1…
@jsunderhood Lighthouse измеряет только скорость загрузки страницы, практически ничего не говорит о возможной скоро… twitter.com/i/web/status/1…
13:35
Смысл в том, что когда на странице происходит какое-то изменение, нужно выполнить performance.mark('my-mark'), и эт… twitter.com/i/web/status/1…
13:37То есть нужно будет дописать в коде метрики в тех местах, производительность которых требуется отслеживать
13:39Ещё есть вкладка Performance в хроме, где можно профилировать приложение, но пока я не буду на этом останавливаться
13:44Если вы знаете и используете какие-то другие инструменты для мониторинга производительности, напишите! А я пока перейду к метрикам.
13:55@jsunderhood Если спиннер появляется дольше чем на "Оооооп", но приложение медленное!14:11
@jsunderhood Ежедневно мониторю Page Load Speed в Яндекс.Метрике, так как там показывается срез загрузки сайта у ре… twitter.com/i/web/status/1…14:35
Метрик производительности довольно много. Они показывают определенные события, которые происходят в процессе загруз… twitter.com/i/web/status/1…
15:19Отслеживать все возможные метрики не нужно — мы поначалу так делали, но потом поняли, что это довольно бессмысленно.
15:19Сейчас мне кажется оптимальным следить за Core Web Vitals, это отличный вариант, если вы не знаете, с чего начать.… twitter.com/i/web/status/1…
15:19Особенно важны Core Web Vitals, если у вас сайт, индексируемый поисковиками — гугл умеет определять скорость загруз… twitter.com/i/web/status/1…
15:21Если у вас SPA, или приложение, которое не индексируется, Core Web Vitals можно рассматривать как показатель скорос… twitter.com/i/web/status/1…
15:24@jsunderhood В какой момент нужно задумываться о производительности и начинать её измерять?
Хороший вопрос. В идеальном мире, на этапе проектирования. В реальности, перед выходом в продакшен уже хорошо. Мы з… twitter.com/i/web/status/1…
@jsunderhood В какой момент нужно задумываться о производительности и начинать её измерять?
15:40
Скорее всего, для мониторинга интерактивности SPA потребуется добавить собственные метрики, которые будут показыват… twitter.com/i/web/status/1…
15:49Для отслеживания скорости переключения между страницами и взаимодействия, например, когда по действию что-то появл… twitter.com/i/web/status/1…
Я немного рассказала об этом в соседнем треде:
Для отслеживания скорости переключения между страницами и взаимодействия, например, когда по действию что-то появл… twitter.com/i/web/status/1…
15:50
В зависимости от используемого инструмента, метрики можно визуализировать на графиках. Вот, например, так выглядит… twitter.com/i/web/status/1…
15:56@jsunderhood Плюсую, производительность - это базовое свойство системы. Если его не закладывать изначально, то пото… twitter.com/i/web/status/1…17:10
@jsunderhood Что скажешь по поводу недавнего добавления поддержки HTTP/2?"With this improvement, you can expect m… twitter.com/i/web/status/1…
Спасибо, пропустила эту новость. Мне кажется, что для сервисов, использующих HTTP2, синтетические метрики будут бо… twitter.com/i/web/status/1…
@jsunderhood Что скажешь по поводу недавнего добавления поддержки HTTP/2?
"With this improvement, you can expect m… twitter.com/i/web/status/1…
17:20
@jsunderhood Мы сейчас используем APDEX apdex.org как способ выразить производительность продукта осн… twitter.com/i/web/status/1…18:27
@mr_mig_by @jsunderhood Если это базовое свойство системы, то оно должно быть зафиксировано в требованиях, при этом… twitter.com/i/web/status/1…
В моём представлении, разработчик участвует во всех этапах жизни приложения. Требования не должны появляться, пото… twitter.com/i/web/status/1…
@mr_mig_by @jsunderhood Если это базовое свойство системы, то оно должно быть зафиксировано в требованиях, при этом… twitter.com/i/web/status/1…
18:32
@jsunderhood Было бы здорово иметь инструмент для тестирования производительности взаимодействия, типа Lighthouse,… twitter.com/i/web/status/1…18:32
@jsunderhood По поводу сатисфакции и конкретных чисел в трешхолдах тоже интересно. Например Гугл как-то писал о мод… twitter.com/i/web/status/1…18:42
@jsunderhood В интерактивных приложениях немного другая модель. Например навигация должна быть максимально быстрой,… twitter.com/i/web/status/1…
UX и визуальная производительность очень интересная тема!
@jsunderhood В интерактивных приложениях немного другая модель. Например навигация должна быть максимально быстрой,… twitter.com/i/web/status/1…
18:48
# Среда 35 твитов
@jsunderhood А у вас как-то эта история автоматизирована (например, после выкатки очередного билда приходит репорт,… twitter.com/i/web/status/1…
У нас сбор, мониторинг и алерты по метрикам настроены через SoeedCurve, данные собираются несколько раз в сутки, и… twitter.com/i/web/status/1…
@jsunderhood А у вас как-то эта история автоматизирована (например, после выкатки очередного билда приходит репорт,… twitter.com/i/web/status/1…
6:10
Привет! Сегодня расскажу о том, как устроены процессы работы над web perf у нас в компании.
7:58Немного контекста. В Semrush много (30-40?) кроссфункциональных команд разработки, и каждая полностью отвечает за с… twitter.com/i/web/status/1…
8:31И есть инфраструктурная команда, которая делает интеграционный сервис с общими частями интерфейса и API, куда все о… twitter.com/i/web/status/1…
8:31Отсюда следуют несколько особенностей:
8:32Стек технологий у всех команд очень разный. Пожалуй, общее только то, что фронте почти у всех TS + React (потому чт… twitter.com/i/web/status/1…
8:38Это, с одной стороны, повышает вовлеченность команд в их работу (многих мотивирует то, что они сами принимают решен… twitter.com/i/web/status/1…
8:40Для принятия решений, которые будут влиять на работу многих команд, создаются рабочие группы из заинтересованных уч… twitter.com/i/web/status/1…
8:47Так как команда саа принимает решения по своему продукту, мы, как рабочая группа по webperf, не можем "заставить" и… twitter.com/i/web/status/1…
8:57Еще одна особенность, вызванная архитектурой, где много SPA встраиваются в общий сервис — при переходе по меню, пол… twitter.com/i/web/status/1…
9:12До того, как мы начали заниматься улучшением скорости загрузки и оптимизировать размеры бандлов, типична была ситуа… twitter.com/i/web/status/1…
9:16@jsunderhood Простите, пожалуйста, за вероятный повтор. Может пропустил.Но сколько человек в вашей "рабочей групп… twitter.com/i/web/status/1…
В рабочей группе 2 фронтенд-разработчика и engineering manager, так как в основном мы фокусируемся на фронтенде. Пр… twitter.com/i/web/status/1…
@jsunderhood Простите, пожалуйста, за вероятный повтор. Может пропустил.
Но сколько человек в вашей "рабочей групп… twitter.com/i/web/status/1…
9:35
У нас есть некоторое разделение ролей, я больше занимаюсь "экспертизой", создаю общие решения, и консультирую коман… twitter.com/i/web/status/1…
9:48Но мы в целом готовы подхватить задачи друг друга :)
9:49Когда мы решили заняться оптимизациями веб-производительности, основными задачами стали:
10:10Список метрик мы определили исходя из типа приложения: для статичных страниц и для SPA.
12:41Для статичных страниц отслеживаем:
12:46Для SPA метрики те же, и дополнительно отслеживаем собственную метрику First App Render, которая показывает в секун… twitter.com/i/web/status/1…
12:46Значения метрик мы выбирали, основываясь на:
12:48Список метрик и их значений общеизвестен в компании, хранится в Confuence, и при необходимости обновляется.
12:50Также есть рекомендации по размерам JS/CSS-бандлов, их значения тоже немного отличаются для статичных станиц и для SPA.
12:53При выборе инструмента мониторинга ориентировались на возможности создать "спейс" для каждой из команд разработки,… twitter.com/i/web/status/1…
12:57Через SpeedCurve мониторим как синтетические метрики (lab tests несколько раз в день), так и снимаем данные по прои… twitter.com/i/web/status/1…
13:01Для каждой команды разработки настроен свой спейс с дашбордами (по дашборду на каждый продукт команды), на которых… twitter.com/i/web/status/1…
13:19Если по какой-то метрике произошло превышение допустимого значения, об этом приходит уведомление в Slack команде.
13:20Приложения, которые нужно оптимизировать в первую очередь, выбрали количеству трафика и критичности для пользовател… twitter.com/i/web/status/1…
13:59С командами, отвечающими за эти сервисами, вели точечную работу:
14:05Это дало неожиданный эффект, некоторые команды, у которых ещё не был запланирован webperf-аудит, сами находили проб… twitter.com/i/web/status/1…
14:07В течение года, мы провели аудиты примерно 20 команд, и поняли, что дальше продолжать не очень эффективно — в прило… twitter.com/i/web/status/1…
14:12Теперь делаем аудит по запросу от команд, чаще всего это бывает перед выходом нового продукта в продакшен.
14:14Если у вас похожая ситуация, то полезным может быть выделить самый распространенный user flow, понять, какие продук… twitter.com/i/web/status/1…
14:16Оказалось, что многие проблемы общие у разных команд/продуктов, и можно создать единый список рекомендаций, best pr… twitter.com/i/web/status/1…
14:24Про рекомендации, случаи из практики, best practices, планирую рассказать завтра и послезавтра
14:26Попросили показать, как выглядят дашборды. Показываю :) Красная горизонтальная линия — отметка на которой происходи… twitter.com/i/web/status/1…
15:01⏱ Улучшение метрики First Contentful Paint (FCP) — нелегкая и комплексная задача. Однако, есть простые шаги с котор… twitter.com/i/web/status/1…
Тред про улучшение метрики First Contentful Paint (FCP)
⏱ Улучшение метрики First Contentful Paint (FCP) — нелегкая и комплексная задача. Однако, есть простые шаги с котор… twitter.com/i/web/status/1…
15:11
# Четверг 1 твит
Thread of my favorite web performance tools 🚀15:15
# Пятница 15 твитов
Привет! Сегодня поговорим про оптимизации, что влияет на метрики, расскажу про best practices и случаи из жизни :)
9:12Выделю три основные направления возможных оптимизаций:
10:061. Про бандлы и доставку:
11:59Кажется очевидным, но почему-то часто об этом забывают:
11:59Тоже очевидно, но всё же, убедитесь, что вебпак собирает бандлы в продакшен-режиме с включенной опцией minimize: pic.twitter.com/RgHk5F3Ajr
12:31Следующим шагом можно настроить в вебпаке разбивку на чанки. Чтобы это сделать, неплохо для начала проанализировать… twitter.com/i/web/status/1…
12:31Распространён подход, когда в один чанк (или несколько) выносят зависимости node_modules, а в другой код приложения… twitter.com/i/web/status/1…
12:42Лучше, изучив состав бандла через webpack-bundle-analyzer, выделить в отдельный чанк общие зависимости для всех роу… twitter.com/i/web/status/1…
12:42Для генерации отдельного чанка для каждого роута отлично подходит React.lazy() в сочетании с react-router ru.reactjs.org/docs/code-spli…
13:28Дать файлам чанков человеко-читаемые имена поможет волшебный комментарий для вебпака: pic.twitter.com/yQN2fHTxXF
18:10Хорошим способом сократить объем кода, скачиваемого при первой загрузке React приложения, будет импортировать с laz… twitter.com/i/web/status/1…
18:49Некоторые npm пакеты могут существенно увеличить объем бандла кодом, который никогда не будет использован. Например… twitter.com/i/web/status/1…
19:04Исключить лишние локали из moment.js можно через moment-locales-webpack-plugin,
github.com/iamakulov/mome…, IgnorePlu… twitter.com/i/web/status/1…
Про загрузку только необходимых функций lodash, можно почитать тут: azavea.com/blog/2019/03/0…
19:04Про загрузку, отрисовку и взаимодейстивие со страницей продолжу завтра
19:10# Суббота 12 твитов
2. Про загрузку и отрисовку страницы:
14:12Чтобы разобраться в том, как оптимизировать отрисовку, нужно понимать, как браузер рендерит страницу.
Пара ссылок:… twitter.com/i/web/status/1…
Блокируют отрисовку страницы:
14:28Чтобы немного упростить браузеру задачу отрисовки:
14:38Пользователь, заходя на страницу, видит только какую-то её часть. Важно сделать так, чтобы эта видимая часть отобра… twitter.com/i/web/status/1…
14:49Применение critical css позитивно скажется на метриках, например, Largest contentful paint
14:52На контентные метрики (Largest contentful paint / First meaningful paint) влияет и то, как подключаются и использую… twitter.com/i/web/status/1…
15:03Ещё немного про шрифты:
15:13Про изображения:
15:42Для контентных картинок можно использовать тег picture (developer.mozilla.org/en-US/docs/Web…), чтобы, например, загружать более… twitter.com/i/web/status/1…
15:42Совет от кэпа: убедитесь, что картинки минимизованы и имеют адекватные размеры! Особенно, если картинки могут загру… twitter.com/i/web/status/1…
15:48@jsunderhood Более правильный совет будет - не мешайте Webpack делать его работу и не советуйте как следует разделя… twitter.com/i/web/status/1…16:00
# Воскресенье 25 твитов
Кулстори про клиентский и серверный рендеринг. Есть мнение, что рендерить страницу на сервере быстрее, чем на клиен… twitter.com/i/web/status/1…
8:00Постепенно к странице появлялись всё новые требования: сначала кастомизации в зависимости от тарифного плана и стра… twitter.com/i/web/status/1…
8:00Поддерживать это стало очень сложно, решили снова переписать на реакте. Страница стала отдаваться за 200мс, но выро… twitter.com/i/web/status/1…
8:00Тогда придумали к̶о̶с̶т̶ы̶л̶ь изящное решение: для видимой части сверстали скелетон (штуку как на картинке) и заинл… twitter.com/i/web/status/1…
8:00Если нужно передать через шаблон данные с сервера на клиент (например, initial state для redux store), лучше заверн… twitter.com/i/web/status/1…
8:103. Про взаимодействие и UX.
8:33Если использовать скелетон, а не спиннер, то пользователям кажется, что страница загружается быстрее:… twitter.com/i/web/status/1…
8:38Полезно изучить, как пользователи переходят по страницам сайта, и использовать это знание для предварительной загру… twitter.com/i/web/status/1…
11:59С rel="prerender" нужно работать осторожно, так как это ускоряет следующую страницу для части пользователей за счёт… twitter.com/i/web/status/1…
11:59Используюя rel="preload" можно скачать и закешировать ресурсы, которые скоро понадобятся. В отличие от rel="prerend… twitter.com/i/web/status/1…
12:05Guess.js — экспериментальная библиотека, которая на основе данных гугл-аналитики предсказывает, на какую страницу д… twitter.com/i/web/status/1…
12:11Для Webpack есть preload-webpack-plugin, он решает проблему добавления ссылок на ресурсы с хешем в имени:
npmjs.com/package/@vue/p…
Совсем немного про отзывчивость интерфейса:
12:51Если в течение ~100мс после действия (клик по кнопке, нажатие на меню, фокусировка в инпуте и начало ввода текста и… twitter.com/i/web/status/1…
12:51Поэтому важно не блокировать интерфейс при выполнении запросов к API и других операциях, и максимально быстро показ… twitter.com/i/web/status/1…
12:58Есть паттерн Optimistic UI, согласно которому предполагается, что операция завершилась успехом, и показывает резуль… twitter.com/i/web/status/1…
13:00Особенно хорошо такой подход работает в случае с атомарными независимыми друг от друга операциями
13:02Как реализовать Optimistic UI с Apollo GraphQL:
apollographql.com/docs/react/per…
Как реализовать Optimistic UI с React Query:
react-query.tanstack.com/guides/optimis…
С вами была Ирина Соколовская, и моя неделя в этом аккаунте подошла к концу. Вы классные, мне было с вами интересно… twitter.com/i/web/status/1…
13:54Давайте для начала познакомимся, сегодня расскажу немного о себе и своём пути в разработке.
О себе:
Давайте для начала познакомимся, сегодня расскажу немного о себе и своём пути в разработке.
13:54
Доброе утро! В ближайшие три дня планирую рассказать:
Опросы о том, насколько аудитория андерхуда знакома с темой веб-производительности:
Доброе утро! В ближайшие три дня планирую рассказать:
13:54
Первая тема — о метриках web performance. Как замерить, насколько приложение быстрое, какие для этого существуют метрики и инструменты.
О метриках и инструментах:
Первая тема — о метриках web performance. Как замерить, насколько приложение быстрое, какие для этого существуют метрики и инструменты.
13:54
Привет! Сегодня расскажу о том, как устроены процессы работы над web perf у нас в компании.
О процессах работы над производительностью в компании:
Привет! Сегодня расскажу о том, как устроены процессы работы над web perf у нас в компании.
13:54
Привет! Сегодня поговорим про оптимизации, что влияет на метрики, расскажу про best practices и случаи из жизни :)
Оптимизации, лучшие практики, истории:
Привет! Сегодня поговорим про оптимизации, что влияет на метрики, расскажу про best practices и случаи из жизни :)
13:54
# Ссылки
other
- https://speedcurve.com/
- https://www.apdex.org/
- https://ru.reactjs.org/docs/code-splitting.html#reactlazy
- https://github.com/iamakulov/moment-locales-webpack-plugin
- https://www.azavea.com/blog/2019/03/07/lessons-on-tree-shaking-lodash/
- https://caniuse.com/?search=woff2
- https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture
- https://www.npmjs.com/package/@vue/preload-webpack-plugin
- https://www.apollographql.com/docs/react/performance/optimistic-ui/
- https://react-query.tanstack.com/guides/optimistic-updates