
- Главная
- Каталог
- Интернет технологии
- Frontend разработчик
Frontend разработчик
Библиотека Frontend программиста. Книги, полезные материалы, статьи, новости, уроки по front end/web разработке.
Статистика канала
onClick после старта зависала на 2 секунды, перебирая огромный массив, FID всё равно мог быть идеальным (например, 3 мс), хотя пользователь видел намертво зависший интерфейс.
Что измеряет INP?
INP фиксирует всё время до появления визуального отклика на экране:
1. Ожидание освобождения Main Thread (Input delay)
2. Выполнение вашего JS-кода (Processing time)
3. Пересчет стилей, Layout и саму отрисовку (Presentation delay)
Хороший INP - это меньше 200 мс. Причем берется не среднее значение, а один из худших результатов за сессию (98-й перцентиль).
🛠 Как спасать INP (Senior level):
1. Разбивайте Long Tasks (Yield to Main Thread)
Не заставляйте браузер делать всю тяжелую работу за один присест. Дайте ему возможность «вздохнуть» и отрисовать кадр. В современных браузерах для этого внедряется scheduler.yield().
async function handleHeavyClick() {
// 1. Показываем лоадер (синхронно, легко)
showSpinner();
// 2. Отдаем управление браузеру, чтобы он успел отрисовать лоадер!
// Если scheduler.yield недоступен, используем await new Promise(r => setTimeout(r, 0))
if ('scheduler' in window && 'yield' in scheduler) {
await scheduler.yield();
} else {
await new Promise(resolve => setTimeout(resolve, 0));
}
// 3. Теперь делаем тяжелую работу
processHugeData();
}
{}
2. Используйте startTransition в React 18+
Если клик вызывает обновление состояния, которое требует тяжелого рендера (например, фильтрация большого списка), React может заблокировать отрисовку того же чекбокса, на который вы нажали.
Оберните тяжелое обновление стейта в startTransition - React пометит его как низкоприоритетное и не будет блокировать UI.
3. Избегайте Layout Thrashing
Если в обработчике клика вы сначала читаете размеры элемента (el.offsetHeight), а потом меняете классы, вы заставляете браузер синхронно пересчитывать стили (Forced Synchronous Layout). Это убивает фазу Presentation Delay. Сначала читайте, потом пишите!
📲 Мы в MAX
👉 @frontend_1framer-motion, react-spring и писали горы логики, чтобы держать старый DOM-узел живым во время анимации.
Теперь это делает сам браузер на уровне движка с помощью View Transitions API.
В чем суть?
Когда вы вызываете API, браузер буквально делает скриншот текущего состояния, замораживает его, дает вам обновить DOM, делает скриншот нового состояния и автоматически создает CSS-анимацию (по умолчанию crossfade) между этими двумя «кадрами».
🚀 Как это выглядит в коде (SPA):
Вместо синхронного изменения стейта оборачиваем апдейт в один метод:
// Функция, которая меняет DOM (например, рендер нового роута)
function updatePage() {
renderNewRoute();
}
// ❌ Как было:
// updatePage();
// ✅ Как теперь:
if (!document.startViewTransition) {
updatePage(); // Фолбэк для старых браузеров
} else {
// Браузер сам создаст плавный переход
document.startViewTransition(() => updatePage());
}
{}
🧠 Senior-уровень: Анимация конкретных элементов
Дефолтный crossfade всей страницы это скучно. Самое крутое, это Hero-анимации (когда элемент перелетает на новое место с изменением размера).
Чтобы браузер понял, что маленькая аватарка в списке и большая аватарка в профиле - это один и тот же элемент, им просто нужно дать одинаковое CSS-свойство view-transition-name:
/* На странице списка */
.user-avatar-small {
view-transition-name: user-avatar;
}
/* На странице профиля (после апдейта DOM) */
.user-avatar-large {
view-transition-name: user-avatar;
}
{}
Всё! При вызове startViewTransition браузер сам рассчитает траекторию, скейл и плавно переместит аватарку.
🔥 А что с классическими многостраничниками (MPA)?
Это самая бомба. Chrome уже поддерживает кросс-документные переходы (между реальными HTML-страницами вашего сайта). Не нужно никакого JS!
Просто добавляем в CSS:
@view-transition {
navigation: auto;
}
{}
И страницы начнут плавно перетекать друг в друга при клике на обычные ссылки <a href="...">.
📲 Мы в MAX
👉 @frontend_1toSorted(), toSpliced() и with()
Сколько раз вы ловили трудноуловимые баги в React или Redux из-за того, что методы sort(), reverse() или splice() незаметно мутируют оригинальный массив?
Раньше, чтобы обновить состояние, нам приходилось плодить поверхностные копии через спред-оператор.
// ❌ Старая школа (много шума)
const sortedUsers = [...users].sort((a, b) => a.age - b.age);
// А замена элемента по индексу вообще выглядела как пытка:
const updatedUsers = [...users];
updatedUsers[index] = newUser;
{}
В стандарте ES2023 (Baseline 2023) JavaScript наконец-то получил нативные иммутабельные методы массивов. Они делают то же самое, но возвращают новый массив, оставляя оригинал нетронутым.
🚀 Как пишем теперь:
1. Сортировка и разворот
// ✅ Оригинал цел, получаем новый массив
const sorted = users.toSorted((a, b) => a.age - b.age);
const reversed = users.toReversed();
{}
2. Удаление/вставка (вместо splice)
const months = ["Jan", "Mar", "Apr", "May"];
// Вставляем "Feb" на индекс 1 (ничего не удаляя)
const fixedMonths = months.toSpliced(1, 0, "Feb");
// ["Jan", "Feb", "Mar", "Apr", "May"]
{}
3. 🔥 Метод with() - киллер-фича для React
Заменяет элемент по индексу без мутаций. Идеально для обновления конкретного элемента в массиве состояния.
const state = ['apple', 'banana', 'cherry'];
// Меняем 'banana' на 'mango'
const newState = state.with(1, 'mango');
// ['apple', 'mango', 'cherry']
{}
💡Методы работают не только с массивами, но и с TypedArrays (например, Uint8Array). А метод with() отлично справляется с отрицательными индексами - arr.with(-1, newItem) заменит последний элемент массива без вычисления его длины!
📲 Мы в MAX
👉 @frontend_1Отзывы канала
всего 4 отзыва
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
Frontend разработчик — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 10.8K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 5.3, количество отзывов – 4, со средней оценкой 5.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 6363.63 ₽, а за 47 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий