«Реактивный» Интерфейс. Лекция Артёма Белова На Fronttalks 2018

В браузерном JavaScript интерфейсы стали предсказуемыми.

«Однопоточный», с транзакционным скриптом рендеринга: пустой экран — загрузка — интерфейс.

Разработчик Артём Белов из Cxense с акцентом на закон Парето рассказал, как, потратив 20% времени, рендеринг приложения на 80% быстрее с помощью приёмов «реактивного дизайна» — ещё не сформулированных, но уже используемых в продуктах с приоритет на UX.

А как насчет более опытных ребят, которые не вылезают из Webpack и не заставляют Webpack страдать, а не наоборот? Они включают в себя плагины.

Но поскольку мы находимся в начале разработки этой методики, экосистема предлагает нам плагин, который берет ваш HTML, генерирует на его основе HTML со встроенным CSS, выдает QR-код для рекламы.

Серьезно? После этого можно использовать «!important», чтобы прервать стили.

Возможно, стоит задаться вопросом, почему я до сих пор во фронтенде.

— Всем привет, я Артём Белов.

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

Ну, для меня это все-таки физика, закон сохранения импульса.

Начнем с проблемы.

Это наш профессиональный перфекционизм.

Ведь мы не показываем интерфейс до тех пор, пока он не станет «идеальным» — по нашему мнению.

И я не знаю, что победит в номинации за информативность: белый экран браузера или спиннер с надписью «Не стесняйтесь ждать вечно»; Мне это не ясно.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Но одно можно сказать наверняка: рендеринг, как и ответ приложения, не является транзакцией.

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



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

А во фронтенде вообще себе помогаем, лежим.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

В основном, когда мы говорим о «времени загрузки» нашего приложения, мы не говорим всю фразу — «среднее время загрузки».

Хотя не нужно быть гением, чтобы сделать вторую загрузку приложения мгновенной, используя Service Worker. И грустно, что Lighthouse поощряет тот факт, что приложение может не подавать признаков жизни и только на последних двух-трех кадрах проверки говорит: «Я вообще-то собираюсь рендерить».



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

И получить оценку 100 и меньше в тесте производительности приложения — сейчас не самое сложное.

Гугл это заметил, спасибо.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

И такое емкое понятие, как «Время интерактивности», было разделено на этапы, а именно: «Первый интерактивный», «Время последовательного интерактивного взаимодействия» и «Первая задержка ввода».

Если первые два термина можно понять с помощью Google Translate, как взаимодействовать и улучшать, то второй можно объяснить, заглянув в основную ветку браузера.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Пример.

Если пользователь нажимает на текстовое поле сразу после загрузки интерфейса, может возникнуть пауза, прежде чем в текстовом поле отобразится курсор ввода.

Это связано с тем, что основной поток был занят, и в момент щелчка интерфейс казался готовым к взаимодействию.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Все это сводится к тому, что метрики в Lighthouse имеют практически одинаковое время выполнения — тогда они должны быть сбалансированы.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

«Первая осмысленная отрисовка» должна быть максимально быстрой, «Первая содержательная отрисовка» должна быть позади, а «Время последовательного взаимодействия» не должно иметь такой большой разницы от белого экрана браузера до полной готовности интерфейса.

Конечно, найдутся специалисты, которые скажут, что достигается это просто: «Нам нужно разбить приложение на маршруты в Webpack и выполнить рендеринг на стороне сервера.

Да тут работы на полчаса!» Но это не совсем так.

Уважаемый эксперт не упоминает, что на каждом новом маршруте происходит одно и то же - загрузка.

И опять же, все метрики в Lighthouse имеют между собой небольшую дельту, потому что маршрут обычно значим.

А бывает, что ты не работаешь в крупной успешной компании, и Серверного рендеринга там нет. И, пользуясь своим служебным положением, вы начинаете R&D с четкой целью — получить прогрессивный рендеринг.

Как прогрессивный JPEG в пункте 167 «Путеводителя» Лебедева.

В принципе, план НИОКР выглядит очень просто.

Нужно как-то получить прибыль.

И не забывайте о главном – времени и дедлайнах, которые любят гореть.

И, держа в руках манифест программиста-минималиста, вы должны помнить: тратьте 20% своего времени на 80% результата.

Я закрепил инструменты.

Например, лаг-радар.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Я, правда, не углублялся в Санта-Барбару, которая украла у кого-то идею, Дэн Абрамов или наоборот. На прошлой презентации JSConf Island 2018 была показана довольно интересная концепция: радар зеленый, пока не обнаружит задержки в основной ветке, и когда они чувствительны, радар становится желтым, а когда они критичны, радар становится красным.

И, нажав Cmd+Shift+P на Mac или Ctrl+Shift+P на Windows, я посмотрел процент покрытия кода.

И тут я посмотрел на связку.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

И снова на обложке, и снова на связке.

И я просто решил принять ситуацию.

Мне не нужно ничего отсюда уносить.

В конце концов, во многих проектах используются инструменты, которые де-факто являются стандартами.

Например, Иван Акулов совместно с Google Chrome Labs давно создал репозиторий для оптимизации веб-пакетов — webpack-libs-optimizations. И зачем мне это повторять, говорить о Code Split, о Lazy load? Это то, что известно и является прогрессивным стандартом 2018 года.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

А отвечая на вопрос «Что можно скачать за полсекундыЭ» — JS и здесь победитель.

Например, вы можете скачать 100 килобайт JPG и потратить на его обработку 0,04, но JS об этом позаботится, потому что на его обработку уходит гораздо больше времени, в 20 раз.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Потому что вам нужно запомнить, что происходит при запуске приложения.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

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

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Я посмотрел, что тег предлагает нам.

Вариантов много, и я решил воспользоваться подсказкой.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Хм, в зале нет ни пультов, ни телефона.

Я беру 50:50. У нас остались опции «defer» и type="module".



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Они загружаются, не блокируя парсинг, но обрабатываются сами и выполняются позже, когда приложение будет к этому максимально готово — освобождая основной поток.

Но правильного варианта не существует, и на ум приходят слова великого человека Бена Шварца.

Не то чтобы он сказал это по-русски, но:

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Чтобы этого избежать, мне нужен JS, поэтому Initial Request — единственный способ избавиться от ненужных запросов.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Что ж, вам придется снова настроить Webpack. Это не всегда подключение плагинов.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Глядя на разрез бандла, я не очень понимаю, как я повторяю те или иные фрагменты кода между файлами.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Возможно, их стоит включить в Критический запрос?

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

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

Затем определите, существует ли асинхронный код, который можно внедрить.

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

Да, возьмите фрагмент времени выполнения и вставьте его в HTML.

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

В общем, интеграция мозгов Webpack даёт не самый феерический прирост, но сейчас поговорим о Critical CSS.

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Но.

мы поняли, что Critical CSS невозможен для ребят, у которых одностраничное приложение.

В конце концов, без полного HTML-маршрута инструменты не смогут создать критический CSS.

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

И хорошо, что есть Кукловод, который смог это сделать.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Ведь то, что вместе с ним было представлено — папка «puppeteer-examples» на GitHub — было раскуплено для проектов.

Так родился проект Rendertron. Правда, чтобы получить от него хоть какую-то ошибку, нужно вставить адрес, нажать Enter. и всё.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Хорошо, что есть и другие пакеты npm, которые работают. Они на рынке, судя по всему, дольше.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

После установки и сборки пакета, используя обычный Curl, я могу предварительно отрендерить HTML своего приложения на локальном сервере и тем самым получить Critical HTML, который так необходим для создания Critical CSS.

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Bootstrap HTML вместо ожидания рендеринга дал прирост, как и ожидалось, но останавливаться на достигнутом пока рано.

Давайте продолжим наше путешествие к критическому CSS.

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Еще раз спасибо Эdy Osmani за заботу об экосистеме и создание HtmlCriticalWebpackPlugin(), где для настройки требуется ответить всего на пару вопросов: где сохранять Critical CSS и в каком виде?

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Ох, вы могли заметить подозрительную строчку «малярка».

Это очень интересный момент, когда Оди Османи использует сторонний пакет, у которого, оказывается, даже есть веб-интерфейс.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Но, честно говоря, мне стыдно пользоваться веб-интерфейсом; видимо это для верстальщиков, у которых не установлена командная строка.

Но здесь все просто, как в рекламе Яппи из 90-х: достаточно нажать «Создать».



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

И это даёт не самое феерическое увеличение, но очень чувствительно для первой покраски приложения.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

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

Этот рубеж известен как 3 секунды.

И так начинается раздел, в котором мы, фронтенд-разработчики, редко терпим неудачу: игра со шрифтами.

Рецепты загрузки шрифтов.

Здесь нам поможет font-display. Поняв, что нам не нужно двигаться с места в карьер, давайте сначала определимся: вспышка невидимого текста, FOIT, или вспышка нестилизованного текста, FOUT, нам страшна.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

И - спойлер - самое страшное для нас - это мелькание невидимого текста, так как оно вызывает больше перерисовок.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Короче говоря, посмотрев, какие свойства font-display существуют, вы сможете выбрать для себя подходящий: swap или Fallback. По большому счету, из пяти объектов недвижимости можно выбрать тот, который вам нужен, подходящего варианта нет.

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Более того, я слышал, что существует проект Font Style Matcher, который позволит мне выбрать достойный системный запасной шрифт для моего шрифта Comic Sans и не загружать его из Google Fonts. Хотя это не совсем так.

Есть такие люди, как Зак Зезерман, которые придумали концепцию FOFT.

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Что практически незаметно в браузере.

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

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



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Но что, если я скажу вам, что шрифт можно встроить в CSS? И это правда, и это тоже дает прибавку!

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Это похоже на комбинацию техник.

Вам просто нужно встроить римский шрифт прямо в CSS. Таким образом, можно получить увеличение первого основного знакомства пользователя с приложением, а затем загружать остальные гарнитуры по мере необходимости, но не сразу.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

И сейчас, после стольких манипуляций, «Time to Consistentially Interactive» все еще имеет значительную дельту от других показателей.

Я лишь улучшил окраску приложения.

Это неплохо, но не то, к чему я стремился.

Я думаю, мне нужно уловить какую-то проблему.

И ее поймали за хвост. После всего:

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Совершенно очевидно, почему это не реализовано во многих браузерах.

Прыгающая прокрутка, и как определить, что следует, а что не следует загружать – дело не самое простое.

Возможно, его доставят. Но опять же специалисты вам скажут — есть ленивая загрузка.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Но вспомните, как вы с ним взаимодействуете.

Вы не можете охватить 100% случаев.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

А если вы пойдете по пути оптимизации и выполните все контрольные пункты в книге «Основная оптимизация изображений» Оди Османи, то у вас тоже останутся нерешенные проблемы.

Но я заметил, что Эди Османи любит упоминать Reddit в своих альманахах и статьях на Medium. Я вспомнил, что там работает мой знакомый, и, позвонив ему за советом, он напомнил мне, что есть такое понятие, как Percieved Performance, и это определение лежало в глубине моего сознания.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Кстати, здесь нам помогают дизайнеры.

Это когда важно не время, а то, как вы подадите свою заявку.

И очень правильная тактика для этого — «заполнители контента».



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Например, YouTube может это сделать.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

YouTube удается воспроизвести видео до загрузки всех вспомогательных компонентов.

Это сделано, забегая вперед, за счет заполнителей контента, таких серых анимированных плашек.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Что экосистема предлагает нам на данный момент? Ничего особенного.

КодПен.

Давайте посмотрим их реализацию.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Вполне себе карта, которая может вписаться в любой шаблон дизайна.

Давайте посмотрим…

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Нам нужно объявить несколько переменных на 30 строк, объявить грамм свойств на 50 строк, немного анимации и мы получим 100 строк кода.

Это 10 из 10 по шкале Лиа Виру.

А как насчет более опытных ребят, которые не вылезают из Webpack и не заставляют Webpack страдать, а не наоборот? Они включают в себя плагины.

Но поскольку мы находимся в начале разработки этой методики, то экосистема предлагает нам плагин, который берет ваш HTML, генерирует на его основе HTML со встроенным CSS, выдает QR-код для рекламы, видимо.

Серьезно? После этого можно использовать «!important», чтобы прервать стили.

Возможно, стоит задаться вопросом, почему я до сих пор во фронтенде.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Но есть группа людей, которым шутки по поводу их продукта просто не смешны.

ПостCSS.

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

На них всегда можно положиться.

В частности, вы можете реализовать этот прием — «постоянные заполнители» — используя концепцию CSS «многофонового фона».

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



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

CanIUse только ответы, да.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Выглядит это так, что нам знакомо.

Знакомые – благодаря Medium.

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

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

В коде это выглядит примерно так.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Первый приоритетный запрос начинает нагружать изображение, конечно, тяжелое.

И мгновенно, при получении CSS, отобразится линейный градиент. Но линейный градиент не такой прямой и плавный, как ослабление.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Поэтому код следует подобрать другим плагином, который сделает линейный градиент более плавным.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Но вы можете добавить к наложениям небольшой градиент, чтобы они покрывали все случаи.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

В этом случае это не будет работать должным образом, поскольку изображение слишком сложное, чтобы создать абстракцию только с помощью линейного градиента.

Но скип здесь подойдет.

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

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



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

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



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Но это не совсем то, к чему я стремлюсь.

Я бы хотел, чтобы тяжелые изображения появлялись тогда, когда они мне нужны, а не тогда, когда они нужны браузеру.

И мне нужно разделить это на два файла CSS, поместить один в , где будут легкие изображения, а затем загрузите тяжелые изображения в .



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

А как быть с остальными изображениями, например, в JS?

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

В частности, манипуляции с SVG выглядят разочаровывающе.

Вы вроде хотите перерисовать SVG, но у вас нет контроля над ним через обычный CSS.

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Судя по новым тенденциям, SVG должен будет стать компонентом.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Использование пакета, который Дэн Абрамов использовал в «create-react-app», — «svgr».



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Это инструмент CLI, который просто вставляет SVG в ваш JS, и вы можете работать с ним как с компонентом.

На самом деле это три строки кода.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

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

Наверняка я не попрошу его экспортировать SVG из Sketch «особым способом»?

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Из-за ряда мелких подобных проблем приходится обратить внимание на подозрительно популярные проекты.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Например, некая «react-icon-base», которая предлагает себя в качестве замены ярлык.

А именно, пакет как бы говорит нам: вместо тег, оберните в себя ваш SVG-код, после чего я сам применю свойства: заливку, текст, обводку и все, что захотите, потому что у меня есть логика, которая служит «мостом» из CSS.

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

И с помощью простой команды вы можете создать собственный шаблон svgr для своего проекта.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

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



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

И, наконец, отойти от возможно устаревшего тег к компонентному подходу, о котором все говорят.

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

И в пользу чего? Например, вам рекомендуется попробовать использовать псевдокласс «:export» в ваших файлах SCSS\SASS.

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Я почти уверен, что это работает и в вашей версии Webpack. Псевдокласс «:export» экспортирует переменные, объявленные вами в SCSS. После этого вы можете импортировать их в JS-код. И всё, и не надо обрастать велосипедами, типа какого-нибудь JSON-файла со всеми цветами и так далее.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Svgr позволяет уменьшить первую отрисовку приложения.

Но это не так справедливо, ведь код просто перенесли с CSS на JS. Но во-вторых, мы забыли про скип, какой будет прирост после его использования?

«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

Имея простые навыки динамического импорта, мы воспользуемся следующей техникой.

Давайте загрузим облегченную версию изображения, пропустим заполнитель и отобразим его в интерфейсе.

Затем при динамическом импорте в .

then() будем ждать полноразмерную иконку, не блокируя взаимодействие с интерфейсом.



«Реактивный» интерфейс.
</p><p>
 Лекция Артёма Белова на FrontTalks 2018

В результате мы получаем SVG, который находится под нашим контролем, и мы можем Теги: #CSS #JavaScript #frontend #interfaces #react.js #react #Оптимизация клиента #webpack #postcss #svg #yarn #response #среднее время #tti #lag-ra #preload #prerendering #inline #background-image #placeholders #градиент #прогрессивный рендеринг

Вместе с данным постом часто просматривают: