Время прочтения — 13 минут
Family Frontend Meetup #2
Новшества EcmaScript 2023, как изменился Chrome, дополнительная оптимизация логики компонента Picture, обзор leaflet maps и полезные фишки, о которых вы могли не знать.
Содержание
Чем порадует EcmaScript 2023?
1
Иммутабельные методы массивов
• toReversed, toSorted, toSpliced – аналоги одноименных методов за исключением иммутабельности.
• with – аналог выражения array[0] = value без изменения исходного массива.
2
Обратный поиск по массивам
• findLast, findLastIndex – снова аналоги существующих методов, но перебор начинается с конца массива.
3
Hashbang Grammar #!
Синтаксис, являющийся частью многих языков программирования, теперь доступен и в JS. Шебанг комментарий ведёт себя точно также, как и однострочный // комментарий. Вместо этого, он начинается с #! и действителен только в самом начале скрипта или модуля.
Шебанг комментарий определяет путь к JavaScript интерпретатору, скрипт которого вы хотите выполнить. В любых других случаях используйте // (или многострочный комментарий).
Шебанг комментарий определяет путь к JavaScript интерпретатору, скрипт которого вы хотите выполнить. В любых других случаях используйте // (или многострочный комментарий).
Пример:
#!/usr/bin/env node
your code...
4
Символы как ключи WeakMap
Данное новшество расширяет WeakMap, позволяя использовать уникальные символы (Symbols) в качестве ключей.
Как изменился Chrome?
1
Анимирование дискретных свойств
CSS свойство transition-behavior указывает, будут ли запускаться переходы для анимаций, поведение которых является дискретным.
Значение transition-behavior может быть включено как часть сокращенного transition объявления:
Значение transition-behavior может быть включено как часть сокращенного transition объявления:
transition: all 0.35s allow-discrete;
Что такое дискретная анимация? Такая анимация проходит от одного ключевого кадра к другому без промежуточных значений.
Приведем пример.
Анимировать display свойство можно следующим образом:
.button {
display: block;
opacity: 1;
transition: all 0.5 allow-discrete;
}
Теперь при переключении CSS-свойств элемент плавно исчезнет:
display: none;
opacity: 0;
Без использования allow-discrete, элемент исчез бы мгновенно за счет переключения display свойства в значение none.
Так же allow-discrete можно использовать и для анимаций @keyframes
.card {
animation: spin-and-delete 1s ease-in forwards;
}
@keyframes spin-and-delete {
0% {
transform: rotateY(0);
filter: hue-rotate(0);
}
80% {
transform: rotateY(360deg);
filter: hue-rotate(180deg);
opacity: 1;
}
100% {
opacity: 0;
display: none;
}
}
2
Медиа-выражение prefers-reduced-transparency
Непрозрачные интерфейсы могут вызвать головную боль или стать проблемой при различных нарушениях зрения. Вот почему во многих операционных системах и приложениях существуют настройки, которые уменьшают или удаляют прозрачность пользовательского интерфейса.
С помощью этого нового медиа-запроса в браузере CSS адаптирует интерфейс для пользователей, желающих снизить прозрачность:
.card {
background: hsl(none none 100% / 20%);
@media (prefers-reduced-transparency: reduce) {
background: hsl(none none 0% / 80%);
}
}
Данное выражение имеет два значения:
no-preference
Указывает, что пользователь не указал никаких предпочтений на устройстве. Значение этого ключевого слова оценивается как ложное в логическом контексте.
Указывает, что пользователь не указал никаких предпочтений на устройстве. Значение этого ключевого слова оценивается как ложное в логическом контексте.
reduce
Указывает, что пользователь включил на своем устройстве настройку, позволяющую минимизировать количество эффектов прозрачного или полупрозрачного слоя.
Указывает, что пользователь включил на своем устройстве настройку, позволяющую минимизировать количество эффектов прозрачного или полупрозрачного слоя.
3
Медиа-выражение update
Медиа-запрос update дает возможность адаптировать пользовательский интерфейс к частоте обновления устройства. Функция сообщает значения fast, slow или none, которые относятся к возможностям различных устройств.
Электронные книги и такие устройства, как платежные системы с низким энергопотреблением, могут иметь низкую частоту обновления. Информация о том, что устройство не поддерживает анимацию или частые обновления, позволяет сэкономить заряд батареи или избежать ошибочных обновлений.
Более того, существуют такие сценарии, как печатная бумага или дисплеи с электронными чернилами, которые не поддерживают анимации и имеют единственный проход рендера. Подобный вывод вообще не может обновляться и называется none.
4
Отображение потребляемой памяти при удержании курсора на вкладке
Просто полезное обновление в браузере. Теперь не обязательно открывать консоль разработчика для просмотра такой метрики.
Зарождение идеи дополнительной оптимизации нашего компонента Picture
Используемая для оптимизации технология в данный момент является экспериментальной доступна только в браузерах: Chrome, Opera и Edge. В Safari и Firefox она не поддерживается.
Проверить совместимость можно здесь.
Идея заключается в том, чтобы отдавать пользователю изображение с качеством, соответствующим качеству его связи.
Рассмотрим пример.
Человек едет в поезде. Между городами сигнал слабый, если вообще есть. Соединение очень медленное и едва способно загрузить текстовый формат сайта. В таком случае можно и не надеяться, что изображения отобразятся. Казалось бы, ничего страшного, можно и без картинок обойтись. А если пользователь открывает онлайн-магазин или какой-то маркетплейс? Он хочет найти какой-то определенный товар, например, новое платье для мамы. Можно ли это сделать без визуальной составляющей? Ответ очевиден.
Свойство navigator.connection.effectiveType поможет в определении скорости интернета пользовательского устройство. Что делать с этой информацией? Расскажем в нашей новой статье!
Стоит ли использовать Leaflet вместо Yandex maps?
Один из наших фронтов, плотно поработав с разными картами, пришел к выводу, что для реализации простых задач Yandex.maps не нужны.
“
На практике мне не приходилось решать задачи связанные с такими вещами, как маршрутизация, пробки, поиск и т.д.
В основном это было:
В основном это было:
- Добавить маркер на карте
- Построить кластер
- Открыть попап по клику на маркер
Leaflet (react-leaflet):
Плюсы:
— Проще и понятнее документация в сравнении с Yandex.maps
— Базовых возможностей Leaflet достаточно для реализации вышеперечисленных задач. React-Leaflet может легко интегрироваться с большим количеством доступных плагинов Leaflet, что позволяет добавлять расширенные функции, такие как кластеризация маркеров, анимации, геопространственные операции и т.д.
— Можно легко кастомизировать.
Например, очень просто интегрировать различные сторонние тайлы карт (OpenStreetMap или Mapbox). Это дает большую гибкость в выборе внешнего вида карты. Однако некоторые из них могут быть платными (я использую OpenStreetMap).
Больше возможностей для кастомизации маркеров и всплывающих окон, включая использование собственных HTML-элементов. Проще в реализации popup, c которым пользователь мог бы взаимодействовать.
— Нет ограничений в использовании. У нас все больше проектов ориентированных на рынок Европы, в которых мы не можем использовать Yandex.maps.
— Вообще Leaflet – бесплатные карты. Но для реализации более сложных задач необходимо подключать дополнительные плагины. В зависимости от выбранного поставщика, те или иные функции могут быть платными. Например для реализации геокодирования и обратного геокодирования, можно использовать Google Maps (есть лимиты на количество бесплатных запросов), а можно использовать OpenStreetMap (бесплатные в использовании, но есть ограничение на количество запросов на определенный промежуток времени)
— Можно скрыть логотип «Leaflet | © OpenStreetMap contributors» или добавить свой префикс перед указанием авторства, если в этом есть необходимость.
Минусы:
• Нет поддержки SSR, поэтому операции с DOM, на которые опирается Leaflet для отрисовки карты, недоступны. Поэтому для работы с компонентами Leaflet нужны дополнительные манипуляции, а именно, – использование динамического импорта с next/dynamic
Yandex.maps (react-yandex-maps):
Плюсы:
Поддержка SSR, в отличие от react-leaflet.
— Больше возможностей по сравнению с react-leaflet (построение маршрутов, пробки, поиск и т.п.) (*Ограничен лимитами на количество бесплатных запросов)
— Предоставляют более точные и детальные карты России и стран СНГ, чем это доступно в большинстве стандартных тайлов карт в Leaflet.
Минусы:
• react-yandex-maps – больше не поддерживается по политическим причинам.
• Меньше возможностей для кастомизации по сравнению Leaflet. Например, добавить popup, с котором которым пользователь мог бы взаимодействовать, проще в Leaflet, чем в Yandex.maps.
• Yandex.Maps предлагает как бесплатные, так и платные функции, и их использование регулируется определенными лимитами. (*Обязательно получение API key, даже если вы не используете платные функции карт)
Выбор между react-Leaflet и react-yandex-maps зависит от конкретных требований проекта. Если нужна высокая степень кастомизации, международная поддержка и интеграция со сторонними сервисами, тогда стоит смотреть в сторону React-Leaflet.
С другой стороны, react-yandex-maps подходит для проектов, ориентированных на Россию и СНГ, особенно когда требуется реализация сложных функций, таких как построение маршрутов, поиск по карте и т.п.
Напоследок взглянем на статистику скачиваний react-yandex-maps и react-leaflet и увидим, что именно вторая библиотека в данный момент пользуется большей популярностью.
Полезные фишки и небольшие заметки, о которых вы могли не знать
1
Расположение первой буквы в несколько строк:
&::first-letter {
Initial-letter: 2;
}
2
Глобальная функция в JS для глубокого копирования объектов:
structuredClone()
Зачем устанавливать lodash, если можно использовать встроенный метод?
3
Определение отступа первой строки в текстовом блоке (Отступ абзаца):
text-indent: 20px;
4
Возможность получить активный элемент на странице:
document.activeElement
5
Трансформируем SCSS-переменные в JS-переменные с помощью :export
SCSS переменная:
$white: #fff;
Трансформация:
:export { white: $white;
}
Импортируем файл в наш модуль:
import variables from 'your-path/variables.module.scss';
Используем созданную переменную:
<div className={styles.arrow}> <DownArrow stroke={variables.white} /> </div>
6
Располагаем вертикально строки текста и направление блоков
writing-mode: vertical-lr;
writing-mode: vertical-lr;