Полезности с конференции «Я ❤ Frontend»
Здесь собрал наиболее полезные вещи, которые я выделил для себя из докладов этой конференции. К ним также добавил (постарался не искажать информацию) и свои идеи и недостающие кусочки информации.
document.addEventListener('freeze', (event) => {
// The page is now frozen.
});
document.addEventListener('resume', (event) => {
// The page has been unfrozen.
});
if (document.wasDiscarded) {
// Page was previously discarded by
// the browser while in a hidden tab
}
Не через setTimeout()
!
var requestId = 0;
function animate(time) {
// ...
requestId = window.requestAnimationFrame(animate);
}
function start() {
requestId = window.requestAnimationFrame(animate);
}
function stop() {
if (requestId) {
window.cancelAnimationFrame(requestId);
}
requestId = 0;
}
Можно управлять очерёдностью загрузки элементов на странице, задавая им приоритет. Это лучше, чем ждать пока загрузится всё, подставляя вместо страницы спиннер (и уж тем более хаотичное появление элементов на странице).
Выделять ссылки (именно выделять, а не драгэндропать) в хроме (да и в любых браузерах на основе хромиума), оказывается, можно, зажав кнопку alt
.
На большинстве современных сайтов большие проблемы с доступностью и производительностью. Самый базовый аудит можно провести не только с помощью ментора или код-ревью, но и благодаря простым инструментам разработчика.
Следуя лишь рекомендациям этих помощников можно кардинально улучшить качество своего продукта.
История сборщиков
Вебпак очень гибко настраивается под нужды проекта. При оптимальных настройках (как в этом обзоре) скорость обновления проекта может доходить до 0.2 секунд, что очень и очень здорово!
Что можно делать со статическими файлами
- JS
- lint
- transpile
- polyfill
- bundle
- minify
- CSS
- lint
- transpile
- polyfill
- bundle
- minify
- Assets
- resize
- optimise
Что подсвечивать?
- eslint-loader
- tslint-loader
- stylelint-webpack-plugin
- flow-babel-webpack-plugin
Как увеличить производительность?
- Не подключать ненужные плагины
- Не пересобирать файлы, которые не изменял
- Не сжимать файлы во время разработки
С помощью плагина splitChunks можно научить приложение подгружать только те компоненты, которые необходимы в момент использования.
- Презентация
- Документация вебпака
- https://webpack.js.org/guides/
- https://survivejs.com/webpack/optimizing/performance/
- https://reactjs.org/docs/code-splitting.html
- https://github.com/smooth-code/loadable-components/
- https://npmjs.com/package/babel-plugin-transform-imports/
Когда внутри твоего приложения много мелких виджетов и микро-сервисов (других приложений), то возникает необходимость в хорошей организации общего кода. Например, можно воспользоваться подходом «Micro Frontends», в котором большое приложение выступает в роли бекенда, а маленькие — каждый по себе в виде фронтенда. А именно
- Каждое мелкое приложение запихнуть в
<iframe>
и научить приложения общаться между собой с помощью методаwindow.postMessage(message, targetOrigin, [ transfer ])
. - Воспользоваться методом «Server Side Includes (SSI)»
<!--#include file="header.html"-->
. По сути то же самое, только без<iframe>
. Есть также проект Mosaic, которая пользуется этим же подходом.
Что умеют SVG-фильтры?
Способность | Свойство |
---|---|
Заливка цветом | feFlood |
Добавление картинки | feImage |
Повторение | feTile |
Облака | feTurbulence |
Размытие | feGaussianBlur |
Сужение/расширение | feMorphology erode/dilate |
Смещение | feOffset |
Волны и искажения | feDisplacementMap |
Тень | feDropShadow |
Режимы наложения | feBlend multiply/screen |
Управление цветом | feColorMatrix hueRotate/matrix/luminanceToAlpha |
Управление каналами | feComponentTransfer |
Резкость | feConvolveMatrix |
Источники света | feSpecularLighting |
Источники света | feDiffuseLighting |
Склейка слоёв | feMerge |
Обрезка слоёв | feComposite |
<svg>
<filter id="my-fancy-filter">
<feGaussianBlur
stdDeviation="5"/>
<feColorMatrix in="SourceGraphic"
type="saturate" values=".5"/>
</filter>
</svg>
<filter id="wind">
<feGaussianBlur stdDeviation="30"/>
<feOffset dx="-30" result="offset"/>
<feMerge>
<feMergeNode in="offset"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
const primitive = document.querySelector('#turbulence');
function changeProp() {
primitive.setAttribute('seed', primitive.seed.baseVal + 1);
setTimeout(() => {
requestAnimationFrame(changeProp);
}, 75);
}
requestAnimationFrame(changeProp);
- Презентация
- Спецификация
- The Art Of SVG Filters And Why It Is Awesome
- SVG Filters 101
- Distorted Button Effects with SVG Filters
- A Look at SVG Light Source Filters
- Finessing
feColorMatrix
- Using SVG to Create a Duotone Effect on Images
- SVG-фильтры. Часть 1. Основные понятия и типы. Применение к изображениям для создания графических эффектов
- Примеры
- Variable Pixelation
- Sara Soueidan | SVG Filters - The Crash Course | CSS Day 2018
- Distorted Button Effects
- Using SVG to Create a Duotone Effect on Images
- Можно применять фильтрам даже к видюшкам, как в примерах на презентации
- Sophisticated Filter Effects
- SVG filters
- SVG Filters Experiments (Юлия Бухвалова)
- Набор готовых фильтров в конструкторе
- Инструменты
- Статьи Юлии Бухваловой по SVG
Изображения содержат в себе полезные метаданные в формате EXIF (Exchangeable Image File Format), которые можно распарсить из бинарника («обычная фронтендерская задача») и использовать в своих целях.
Вот здесь можно посмотреть результаты трудов Дмитрия Махнёва по исправлению бага с ориентацией изображения.
Гифки лучше показывать как видюшки. Можно переконвертировать с помощью ffmpeg:
ffmpeg -i bolt.gif -movflags faststart -pix_fmt yuv420p -crf 0 bolt.mp4
А если очень хочется оставить именно анимашку, а не видосик, то можно пользоваться этой утилитой gif2webp:
gif2webp bolt.gif -o bolt.webp
Способы рисовать в вебе:
- CSS-графика
- SVG
- Canvas
- CSS Paint API
Способ нарисовать иконку «бургерного меню» в CSS.
.burger {
width: 12px; height: 10px;
background-image: repeating-linear-gradient(
#4b86c2, #4b86c2 2px,
#fff 2px, #fff 4px
);
}
А есть ещё и CSS Paint API. Вот, как он работает.
div {
--burger-color: #4b86c2;
background-image: url('burger.png');
background-image: paint(burger);
}
CSS.paintWorklet.addModule('burger.js');
А вот и сам burger.js
:
class Shape {
static get inputProperties() {
return ['--burger-color'];
}
paint(context, geometry, properties) { … }
}
registerPaint('burger', Shape);
const color = properties.get(
'--burger-color'
);
context.fillStyle = color;
context.fillRect(0, 0, 120, 20);
context.fillRect(0, 40, 120, 20);
context.fillRect(0, 80, 120, 20);
<picture>
<source type="image/webp"
srcset="cat@2x.webp 2x
cat.webp 1x">
<img srcset="cat@2x.jpg 2x"
src="cat.jpg" alt="Рыжий кот">
</picture>
<img srcset="cat@3x.jpg 3x"
srcset="cat@2x.jpg 2x"
src="cat.jpg"
alt="Рыжий кот">
Для ретины достаточно атрибута srcset
.
В CSS можно загружать SVG-картинки прямо кодом.
button {
background-image: url('data:image/svg+xml,%3Csvg xmlns
='http://www.w3.org/2000/svg' viewBox='0 0 12 10'
fill='%234b86c2'%3E%3Crect width='12' height='2'
x='0' y='0'/%3E%3Crect width='12' height='2' x='0'
y='4'/%3E%3Crect width='12' height='2' x='0' y…');
}
Ленивая загрузка
<img src="picture.jpg" lazyload="on">
<!-- on — откладывает запрос до контента -->
<!-- off — запрашивает сразу же -->
<!-- auto — как решит браузер -->
Приоритет загрузки
<img src="picture.jpg" importance="low">
<!-- high — повышает приоритет загрузки -->
<!-- low — понижает приоритет загрузки -->
Если очень-очень нужно, то осторожно можно:
<link rel="preload" href="picture.jpg" as="image">
Неблокирующий рендеринг
<img src="picture.jpg" async="on">
<!-- on — ждёт, когда у браузера будет возможность -->
<!-- off — декодирует сразу, блокируя основной поток -->
С помощью JS (пока работает только в хроме):
const img = new Image();
img.src = 'picture.png';
img.onload = () => {
// Вставка img
};
img.decode().then(() => {
// Вставка img
});
Проверка поддержки
const img = new Image();
img.src = 'picture.webp';
img.decode().then(() => {
console.info('WebP');
}).catch(() => {
console.warn('Извини');
});
- Презентация
- https://modernizr.com/
- The anatomy of responsive images
- The Origin of the IMG Tag
- What I Learned About Imagery on the Web
- The Joy of Optimizing Images
- Converting Images To WebP
- WebP docs
- The CSS Paint API
- HEIF
- Responsive Images: Use Cases and Documented Code Snippets to Get You Started
- Инструменты для оптимизации изображений
Дизайн-процессы можно автоматизировать и систематизировать. Но в этом много неоднозначных моментов. Нужно стараться сделать свою систему максимально определённой.