Всем привет! Я занимаюсь фронтендом более двух лет, и к новым фичам в стандарте ECMAScript, HTML и CSS привыкла относиться с небольшой опаской — часть из них остаются экспериментальными, некоторые могут ломать совместимость со старыми версиями браузеров. Тем не менее, мне хотелось оставаться в курсе новинок веб-разработки — интересно же, в какую сторону вообще движется веб.
К тому же, когда-то и CSS Grid имел слабую поддержку, а сейчас используется весьма широко. Именно поэтому я решила составить подборку новых концептов, фич, правил и методов, которые мы могли упустить, но которые однажды (или уже) могут стать солидным подспорьем в повседневной работе фронтенд-разработчика.
При написании статьи я использовала следующие источники:
<dialog>
Поддержка: возможность все еще экспериментальная, хотя и поддерживается в большинстве современных браузеров.
Как правило, чтобы добавить модальное окно, требуется совершить некоторое количество приседаний (создать компонент с отдельным div
для фона и еще одним — для основного контента, добавить JS-логику). Новое решение — нативный HTML-элемент <dialog>
.
Внутрь него можно поместить элемент <form>
, в слушатель событий добавить встроенные JS-методы для открытия и закрытия (showModal()
и close()
), а также стилизовать псевдоэлемент ::backdrop
для фона.
Подробнее: в MDN
Поддержка: возможность все еще экспериментальная. Не поддерживается в Firefox.
Появление новых атрибутов popover
и popovertarget
поможет сократить количество кода, требуемого для создания подсказки по ховеру (так, в новом поповере есть встроенное скрытие поповера по клавише Esc). А еще появление поповеров позволит нам кастомизировать выпадающие меню в селектах — смотрите новый экспериментальный нативный HTML-элемент .
Подробнее: popover в MDN
Поддержка: поддерживается большинством современных браузеров.
Когда-нибудь сталкивались с тем, что в мобильном Safari кнопки в модальных окнах оказываются спрятаны за навигационным меню браузера? Пускай времени, проведенного на Stack Overflow, вам никто не вернет, можно наконец выдохнуть — ведь теперь у нас есть small и large viewports (svh
— единица измерения высоты, включающая в себя тулбары браузера, lvh
— высота без учета тулбаров, и динамическая единица измерения dvh
, объединяющая две предыдущие), а также новые единицы измерения vmin
/vmax
.
Подробнее: The large, small and dynamic viewport units
Поддержка: не поддерживается Firefox.
Писать CSS с вложенными селекторами, прямо как в SCSS? Легко! Нужно только включить Experimental Web Platform features у себя в Chrome.
Подробнее: CSS Nesting is coming
Поддержка: поддерживается большинством современных браузеров.
Любите писать CSS, используя BEM? А расширять уже написанные стили так, чтобы иерархия сохранялась? Добавление новых стилей значительно упрощает появление слоев @layer
. Их приоритет выше, чем у обычных селекторов, так что работают они прямо как слои в фотошопе — новые слои перекрывают собой все изменения, добавленные в предыдущих слоях. Таким образом, мы можем избежать проблем со специфичностью — больше никаких !important
(надеюсь, вы и так их не использовали).
Подробнее: Привет, CSS Cascade Layers
Поддержка: поддерживается большинством современных браузеров.
Появление media queries открыло нам верстку, адаптирующуюся под разные размеры экранов. Container queries же позволяют нам писать стили элемента с оглядкой на размеры его родителя, а не всей области просмотра. Этот способ отлично подходит для написания стилей переиспользуемых компонентов, внешний вид которых меняется в зависимости от контейнера.
Подробнее: Полное руководство по Container Queries в CSS
Поддержка: поддерживается большинством современных браузеров.
Если обычных rgb()
и hsl()
вам не хватало, встречайте oklch()
— новый способ определять цвета в CSS, который гораздо лучше подходит для настройки цветов (а еще более доступный). Также обратите внимание на color-mix() — новый инструмент для смешения цветов в CSS.
Подробнее: OKLCH в CSS: почему мы ушли от RGB и HSL
Поддержка: поддерживается большинством современных браузеров.
Возможность добавлять шрифты, где в каждом глифе используется несколько цветов? В вебе? Да! Если раньше это было доступно только в виде векторной графики, теперь настроить палитру шрифта можно прямо в коде.
Подробнее: Color fonts
Не любите писать громоздкий код в духе array[array.length - 1]
? Эта проблема была решена еще в стандарте ECMAScript 2022 с появлением Array.at(-1)
. В ECMAScript 2023 же появилось еще 2 метода — Array.findLast()
и Array.findLastIndex()
.
Подробнее: Array find from last, The .at() method
Методы reverse()
, sort()
и splice()
мутируют исходный массив. В ECMAScript 2023 появляются аналогичные методы, которые возвращают новую копию массива — toReversed()
, toSorted()
и toSpliced()
. Помимо этого, в стандарте был добавлен метод with()
, который заменяет элемент по заданному индексу новым значением, не мутируя исходный массив.
Подробнее: Change Array by Copy
Если вы вдруг пропустили, в ECMAScript 2022 появился новый синтаксис для объявления свойств класса — необходимость в конструкторе отпала. Также приватные свойства и методы теперь позволяют создавать действительно защищенные слоты данных, доступные только в теле класса. Приватные свойства также можно определять через #
(старое правило — добавлять _
в начале имени свойства или метода).
Подробнее: Class fields (public, static, private)
Стандарт ECMAScript 2022 ввел метод hasOwn()
, более безопасный аналог hasOwnProperty.call(object, property)
.
Подробнее: Accessible Object.prototype.hasOwnProperty()
Больше никаких хаков с JSON.parse(JSON.stringify())
и деструктуризацией объекта. Им на смену приходит гораздо более удобный structuredClone()
, позволяющий создавать глубокие копии объектов.
Подробнее: structuredClone() в MDN
Со стандартом ECMAScript 2021 в языке появилась комбинация логических операторов (&&
, ||
и ??
) и оператора присваивания (=
). Так, с ее помощью мы можем присвоить переменной a
значение b
только тогда, когда a НЕ истинно — a ||= b
. Возможно, когда-нибудь пригодится.
Подробнее: Logical Assignment Operators
Кое-что, что вы могли пропустить из стандарта ECMAScript 2020. Как мы знаем, глобальный объект this
зависит от контекста. В браузере это window
, в Node.js это global
. К любому из них теперь можно получить доступ через globalThis
.
Подробнее: globalThis
Удобный оператор, определенный еще стандартом ECMAScript 2020. В отличие от оператора ||
, nullish coalescing оператор ??
срабатывает лишь тогда, когда значение левой стороны строго равно нулю или не определено. Так, выражение "" ?? "default value"
вернет ""
.
Подробнее: Nullish coalescing Operator
Наверняка вам тоже приходилось писать длинные цепочки в духе const title = data && data.article && data.article.title
для присвоения значения переменной (чтобы избежать ошибок). С появлением стандарта ECMAScript 2020 эта громоздкая запись может стать гораздо проще — const title = data?.article?.title
.
Подробнее: Optional chaining
Используете в своей работе Lighthouse для получения статистики о перформансе веб-страниц? Правда, работать с ним не совсем удобно. С появлением плагина Web Vitals работа с оптимизацией в Chrome стала куда проще — теперь вся статистика доступна прямо из консоли.
Подробнее: Using the Web Vitals extension to debug Core Web Vitals issues
Надеюсь, вы, как и я, открыли что-то новое для себя — и кто знает, может, через 5-10 лет мы уже не сможем представить себе веб-разработку без этих концептов?