Итоги недели в мире фронтенда и обзоры новых сервисов: почему React пора сдать в музей

Итоги недели в мире фронтенда и обзоры новых сервисов: почему React пора сдать в музей

📰 Новости

Вышла новая версия супербыстрого сборщика и сервера разработки Vite 6. Основные изменения:

  • Поддержка Node.js. Vite 6 поддерживает Node.js 18, 20 и 22+, но больше не поддерживает Node.js 21.
  • Новый (пока еще экспериментальный) Environment API упрощает разработку, обеспечивая гибкость и улучшая пользовательский опыт.
  • Введено новое значение по умолчанию для resolve.conditions.
  • Улучшена работа с JSON.
  • Расширена поддержка ссылок на ресурсы в HTML.
  • Появилась поддержка postcss-load-config и современных API для Sass.
  • Добавлена возможность кастомизации имени CSS-файла в библиотечном режиме.

Кроме того, разработчики сделали страницу Breaking Changes с подробным описанием всех изменений, которые могут повлиять на проекты.

В новом релизе Astro 5.0 – фреймворка для разработки быстрых и SEO-оптимизированных сайтов, ориентированных на большой объем контента, – много всего полезного:

  • Content Layer (слой контента) предлагает унифицированное хранение всего контента в одном месте, обеспечивает типобезопасность данных и поддерживает импорт контента из разных источников – API, CMS, облачных хранилищ.
  • Серверные острова (альтернатива серверным компонентам в React и частичному пререндерингу в Next.js) обеспечивают быструю загрузку страниц, позволяя встраивать динамический и персонализированный контент в преимущественно статический макет. Динамические и персонализированные элементы при этом могут периодически обновляться из БД.
  • Другая новая функциональность – упрощенный пререндеринг, типобезопасные переменные окружения, интеграция с Vite 6, кадрирование изображений, адаптивные макеты изображений и SVG-компоненты.

Привет!

Мы запустили еженедельную email-рассылку, посвященную последним новостям и тенденциям в мире фронтенда. В еженедельных письмах ты найдешь:

  • Современные JavaScript-фреймворки и библиотеки.
  • HTML5 и CSS3: новые возможности и трюки.
  • Оптимизация производительности веб-приложений.
  • Тестирование и отладка кода.
  • Лучшие практики UI/UX.
  • Новые веб-стандарты и браузерные технологии.
  • Тренды в веб-дизайне и интерфейсах.
  • Прогрессивные веб-приложения (PWA).

Сотрудники Nielsen Norman Group (консалтинговой фирмы по UI/UX) недавно опубликовали результаты исследования о роли атрибута alt во вспомогательных технологиях, в особенности – в экранных читалках. Основные выводы:

  • Главным качеством UI должны быть реальные удобство использования и функциональность, а не только формальная доступность.
  • Чтобы пользователи вспомогательных технологий могли выполнять свои задачи так же легко, как и остальные, необходимо правильно использовать alt. Большинство фронтендеров ошибочно полагают, что текст в этом атрибуте должен подробно описывать изображение.
  • В некоторых случаях alt не нужен вообще.

Автор CSS Tricks подробно проиллюстрировал эти выводы:

  • Если описание не требуется, оставьте атрибут пустым (alt=""). Экранные читалки пропустят такое изображение, вместо того чтобы озвучивать имя файла. Однако убедитесь, что строка действительно пустая. Пробел в alt=" " может быть ошибочно воспринят некоторыми технологиями.
  • Как определить, нужен ли alt:
  • Если текст рядом с изображением уже содержит всю необходимую информацию, alt может быть пустым. Например, если у изображения есть подпись:
<img src="image.jpg" alt=""> <figcaption>Описание изображения</figcaption>
  • Если текст на странице напрямую ссылается на изображение, лучше указать краткое описание в alt, чтобы экранные читалки могли правильно озвучить контекст.
  • Если изображение содержит важные детали, необходимые для выполнения задачи (например, выбор продукта), оно должно быть описано. Но не переусердствуйте: описание должно быть кратким и функциональным.

Что хотят услышать пользователи экранных читалок:

  • Пользователи экранных читалок не пытаются визуализировать изображения. Им важно понять цель изображения. Если картинка декоративная и не несет полезной информации, ее можно пропустить с помощью alt="". Но если изображение выполняет ключевую роль (например, иллюстрирует продукт), его нужно описать.
  • Например, если изображение описывает расположение приборов на столе, достаточно кратко упомянуть ключевые элементы:
  • Тарелка для хлеба слева вверху.
  • Десертная вилка в центре сверху.
Длинные описания могут перегружать пользователя – избегайте лишней детализации
Длинные описания могут перегружать пользователя – избегайте лишней детализации

🤖🎓 Подтянуть свои знания по DS вы можете на нашем телеграм-канале «Библиотека DS для собеса»

🏛 Мнение: React пора сдать в музей

Алекс Рассел, известный специалист в области веб-технологий и веб-стандартов, подробно объяснил, почему React безнадежно устарел и не годится для использования в новых проектах. Это очень объемная статья, так что приведем только самые важные тезисы.

Перегруженность устаревшими компонентами

React создавался для эпохи, когда Internet Explorer 6 еще надо было поддерживать. Его архитектура (например, система синтетических событий и жестко заданный список элементов) была сделана с учетом ограничений IE. Сейчас эти ограничения не актуальны, а React продолжает загружать тонну пакетов для поддержки IE.

Виртуальный DOM не так быстр, как считают фанаты React

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

Amazon не использует React – и работает на смартфонах <a href="https://api.dtf.ru/v2.8/redirect?to=https%3A%2F%2Ftreo.sh%2Fsitespeed%2Fwww.amazon.com%2Fvs%2Fwww.walmart.com%2Fvs%2Fwww.wayfair.com%3Fmetrics%3Dlcp%2Cr%26amp%3BformFactor%3Dphone&postId=3263204" rel="nofollow noreferrer noopener" target="_blank">гораздо быстрее конкурентов</a>
Amazon не использует React – и работает на смартфонах гораздо быстрее конкурентов

React требует сложных решений для устранения проблем, которые он же и создает

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

Альтернативы легче, быстрее и эффективнее

Современные реактивные библиотеки, такие как Svelte, Solid.js или Astro, предлагают аналогичные возможности без больших нагрузок на систему и сложной отладки. Они меньше по размеру, быстрее работают и лучше вписываются в современные архитектуры.

🐘🧩 Интересные задачи по PHP для практики можно найти на нашем телеграм-канале «Библиотека задач по PHP»

Выбор React часто основывается на стереотипах, а не на реальных потребностях

Многие команды выбирают React из-за его популярности, не учитывая, что многие проекты, от простых сайтов и блогов до интернет-магазинов, могут быть разработаны быстрее и проще без SPA-архитектуры, которая создает излишнюю сложность и увеличивает время загрузки. К тому же React избыточен для приложений, которым не нужны длинные пользовательские сессии и сложная интерактивность.

Архитектура React создает сложности с переносом

Если вы используете React, переход на другую платформу может стать серьезной проблемой из-за закрытости его экосистемы. Например, поддержка Web Components в React ограничена.

React замедляет все фреймворки, в которых используется

К примеру, производительность Next.js оставляет желать лучшего – и в основном из-за React:

  • Next.js генерирует существенно больший объем JavaScript по сравнению с более легковесными статическими генераторами сайтов (как 11ty или Astro).
  • Дефолтная конфигурация Next.js загружает большие объемы отложенного JavaScript, что замедляет первоначальную загрузку страницы.
  • Лишний JavaScript конкурирует за пропускную способность с другими важными элементами сайта – рекламным контентом и динамическими данными.
  • React затрудняет эффективное масштабирование приложений на Next.js.

Высокая (во всех смыслах) стоимость разработки

React требует больше ресурсов – как серверных, так и клиентских. Кроме того, зарплаты специалистов по React выше, что увеличивает затраты на проект. Компании, избегающие React, часто выигрывают за счет более низких затрат на инфраструктуру и зарплаты.

🐍🎓 Подтянуть свои знания по Python вы можете на нашем телеграм-канале «Библиотека Python для собеса»

Реактивность может быть достигнута без React

Другие фреймворки и подходы, такие как SSR (серверный рендеринг) или CSR (рендеринг на стороне клиента), позволяют достигать реактивности без избыточного веса и излишней работы, присущих React. Например, Astro позволяет комбинировать статические сайты с реактивными компонентами только там, где это нужно.

React создает ложное чувство удобства

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

React называют «стандартом индустрии», но это в лучшем случае утешительный миф

А в худшем – осознанное искажение реальности, которое умалчивает о многообразии стека инструментов, связанных с React. Ведь React – это не просто библиотека, а целый образ жизни с кучей выборов на каждом этапе. Какой тип компонентов использовать: функциональные или классовые? Какой язык и компилятор предпочесть – TypeScript или все же JavaScript? Какой менеджер пакетов – npm, Yarn, pnpm, Turbo? Какой сборщик – Webpack, esbuild, SWC, Rollup? А что с инструментами вроде Vite, Turbopack или Nx? Или, скажем, какой инструмент для управления состоянием выбрать – Redux, MobX, Apollo или что-то другое? И это еще до обсуждения плагинов для обработки CSS или дополнительных подходов, которые многие команды пробовали интегрировать, например, CSS-in-JS.

React Native – лучший способ создать медленное приложение (или ужасный сайт)

Многие крупные компании, которые раньше активно использовали React Native, теперь от него отказались, потому что на нем можно создать только две вещи:

React Native плохо сказывается на производительности
React Native плохо сказывается на производительности

🤖🧩 Интересные задачи по DS для практики можно найти на нашем телеграм-канале «Библиотека задач по DS»

🥷 13 полезных CSS-трюков

Прижатие футера к низу страницы

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

Пример <a href="https://api.dtf.ru/v2.8/redirect?to=https%3A%2F%2Fcodepen.io%2Ftomasdevs%2Fpen%2FVwooyLX&postId=3263204" rel="nofollow noreferrer noopener" target="_blank">на CodePen</a>
Пример на CodePen

Адаптация UI под разные устройства ввода

С помощью медиазапросов pointer можно улучшить пользовательский интерфейс, адаптируя его под разные устройства ввода (мышь или сенсорный экран):

Пример <a href="https://api.dtf.ru/v2.8/redirect?to=https%3A%2F%2Fcodepen.io%2Ftomasdevs%2Fpen%2FrNXXpzm&postId=3263204" rel="nofollow noreferrer noopener" target="_blank">на CodePen</a>
Пример на CodePen

Позиционирование с помощью inset

Свойство inset – это сокращение для определения отступов от краев контейнера. Оно объединяет в себе свойства top, right, bottom и left, что делает код компактнее и удобнее для чтения:

Пример <a href="https://api.dtf.ru/v2.8/redirect?to=https%3A%2F%2Fcodepen.io%2Ftomasdevs%2Fpen%2FGRVVyWz&postId=3263204" rel="nofollow noreferrer noopener" target="_blank">на CodePen</a>
Пример на CodePen

Стилизация с помощью :empty

Псевдокласс :empty позволяет стилизовать элемент, если он не содержит дочерних элементов или текста. Это может быть полезно для добавления временного контента, например, текста-заполнителя, когда изображение не загрузилось:

Пример <a href="https://api.dtf.ru/v2.8/redirect?to=https%3A%2F%2Fcodepen.io%2Ftomasdevs%2Fpen%2FQWeeQEv&postId=3263204" rel="nofollow noreferrer noopener" target="_blank">на CodePen</a>
Пример на CodePen

Применение стилей к группе элементов без повышения специфичности

Псевдокласс :where() – мощный инструмент для применения стилей к группе элементов без повышения специфичности. Он идеально подходит для универсальных стилей, таких как сбросы (reset) или общие стили, которые не должны конфликтовать с более специфичными правилами:

Пример <a href="https://api.dtf.ru/v2.8/redirect?to=https%3A%2F%2Fcodepen.io%2Ftomasdevs%2Fpen%2FabeeqdR&postId=3263204" rel="nofollow noreferrer noopener" target="_blank">на CodePen</a>
Пример на CodePen

🐘🎓 Подтянуть свои знания по PHP вы можете на нашем телеграм-канале «Библиотека PHP для собеса»

Выравнивание цифр

Свойство font-variant-numeric позволяет выровнять цифры для улучшения их читаемости в определенных ситуациях (таблицы или финансовые отчеты). В частности, значение tabular-nums заставляет цифры занимать одинаковое пространство по ширине, чтобы они выстраивались в виде аккуратных колонок:

Пример <a href="https://api.dtf.ru/v2.8/redirect?to=https%3A%2F%2Fcodepen.io%2Ftomasdevs%2Fpen%2FzYggpeR&postId=3263204" rel="nofollow noreferrer noopener" target="_blank">на CodePen</a>
Пример на CodePen

Ограничение текста определенным количеством строк

Свойство -webkit-line-clamp позволяет ограничить текст определенным количеством строк и добавляет многоточие (...) при превышении этого лимита. Это полезно для управления переполнением текста в карточках, списках или других компонентах с фиксированной высотой:

Пример <a href="https://api.dtf.ru/v2.8/redirect?to=https%3A%2F%2Fcodepen.io%2Ftomasdevs%2Fpen%2FNWQQXbK&postId=3263204" rel="nofollow noreferrer noopener" target="_blank">на CodePen</a>
Пример на CodePen

Применение трансформаций по отдельности

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

Пример <a href="https://api.dtf.ru/v2.8/redirect?to=https%3A%2F%2Fcodepen.io%2Ftomasdevs%2Fpen%2FXWvvVBz&postId=3263204" rel="nofollow noreferrer noopener" target="_blank">на CodePen</a>
Пример на CodePen

Стилизация с помощью :has()

Псевдокласс :has() позволяет стилизовать родительский элемент в зависимости от того, содержит ли он определенного потомка. Это позволяет создавать более динамичные и интерактивные стили, чего раньше было сложно достичь с помощью стандартных CSS-селекторов:

Пример <a href="https://api.dtf.ru/v2.8/redirect?to=https%3A%2F%2Fcodepen.io%2Ftomasdevs%2Fpen%2FPoMMQwP&postId=3263204" rel="nofollow noreferrer noopener" target="_blank">на CodePen</a>
Пример на CodePen

🐍🧩 Интересные задачи по Python для практики можно найти на нашем телеграм-канале «Библиотека задач по Python»

Использование системной цветовой схемы

Системные цвета – это специальные цвета, которые соответствуют цветовой схеме операционной системы или браузера пользователя. Использование системных цветов позволяет вашему сайту автоматически адаптироваться под предпочтения пользователя (темная или светлая тема):

Пример <a href="https://api.dtf.ru/v2.8/redirect?to=https%3A%2F%2Fcodepen.io%2Ftomasdevs%2Fpen%2FKKOOZyz&postId=3263204" rel="nofollow noreferrer noopener" target="_blank">на CodePen</a>
Пример на CodePen

Стилизaция элементов в зависимости от размера их контейнера

Container Queries позволяют стилизовать элементы в зависимости от размера их контейнера, а не только от размера вьюпорта (окна браузера). Это позволяет создавать более гибкие и контекстно зависимые адаптивные дизайны, ориентированные на компоненты:

Пример <a href="https://api.dtf.ru/v2.8/redirect?to=https%3A%2F%2Fcodepen.io%2Ftomasdevs%2Fpen%2FwvVVypd&postId=3263204" rel="nofollow noreferrer noopener" target="_blank">на CodePen</a>
Пример на CodePen

Изменение акцентного цвета для элементов форм

Свойство accent-color позволяет легко менять основной цвет встроенных элементов формы – чекбоксов, радиокнопок и диапазонов (<input type="checkbox">, <input type="radio">, <input type="range">). Это упрощает стилизацию и помогает создать визуально согласованные и эстетически привлекательные формы:

Пример <a href="https://api.dtf.ru/v2.8/redirect?to=https%3A%2F%2Fcodepen.io%2Ftomasdevs%2Fpen%2FbGXXLvR&postId=3263204" rel="nofollow noreferrer noopener" target="_blank">на CodePen</a>
Пример на CodePen

Адаптивные шрифты

Функция clamp() – мощный инструмент для определения адаптивных размеров шрифта. Она позволяет задать минимальное, предпочтительное и максимальное значение размера шрифта одновременно, что сделает текст удобочитаемым на любых устройствах:

Пример <a href="https://api.dtf.ru/v2.8/redirect?to=https%3A%2F%2Fcodepen.io%2Ftomasdevs%2Fpen%2FVwooQRe&postId=3263204" rel="nofollow noreferrer noopener" target="_blank">на CodePen</a>
Пример на CodePen

Автор рассылки: Наталья Кайда

22
Начать дискуссию