Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Игорь Вечканов

FrontFest
November 21, 2017

Игорь Вечканов

FrontFest

November 21, 2017
Tweet

More Decks by FrontFest

Other Decks in Programming

Transcript

  1. Travelpayouts • 5 лет на рынке (до этого были в

    составе Aviasales); • Более 100 000 аффилиатов; • Более 600 млн ₽ выплат; • 18 634 работающие конфигурации виджета поисковой формы; • Ещё 8 виджетов и вайтлейблы.
  2. Отличие от других проектов • Размер; • Агрессивная среда размещения;

    • Локализации + кастомизируемость; • Время на разработку (но это не точно).
  3. Что такое 200кб для виджета? Средний размер по данным HTTPArchive

    http://bit.ly/2hmIF3r : • 3300кб страница; • 450кб JS gzipped (25 js-файлов); • 10мбит средняя скорость интернета в России; • 6250кб за 5 секунд.
  4. Чего мы смогли добиться • 45кб js + 10кб CSS

    + 7кб Logo = 55кб + 7кб; • Эффективность, вымученная а/б тестами; • Почти не было жалоб от партнёров после деплоя на 100%.
  5. Как уместить виджет в 50kb • NPM as a framework:

    - Babel-plugin-lodash / submodules / lodash-es; - date-fns / js-joda вместо moment.js ?. • Monkberry.js for templates; • Постоянный контроль итогового размера дистрибутива: - Size Limit; - Webpack bundle analyzer; - jsize.
  6. Попытка загрузить виджет быстрее основного контента • Не забывать про

    async; • Разделение загрузчика и контента; • Монолитный виджет с закешированным конфигом.
  7. • All initial Не работает в IE и Opera Mini

    Изолирование стилей #mydiv { all: initial; /* blocking inheritance for all properties */ } #mydiv * { all: unset; /* allowing inheritance within #mydiv */ } #mydiv::before, #mydiv::after, #mydiv *::before, #mydiv *::after { all: unset; } 01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14.
  8. Изолирование стилей • All initial (не работает в IE и

    Opera Mini); • Iframe (влияет на скорость загрузки).
  9. Изолирование стилей • All initial (не работает в IE и

    Opera Mini); • Iframe (влияет на скорость загрузки); • Shadow DOM (работает в Chrome, Opera и Android).
  10. Изолирование стилей • All initial (не работает в IE и

    Opera Mini); • Iframe (влияет на скорость загрузки); • Shadow DOM (работает в Chrome, Opera и Android); • CSS Modules.
  11. Изолирование стилей • All initial (не работает в IE и

    Opera Mini); • Iframe (влияет на скорость загрузки); • Shadow DOM (работает в Chrome, Opera и Android); • CSS Modules; • CSS-in-JS styled CSS.
  12. Изолирование стилей • All initial (не работает в IE и

    Opera Mini); • Iframe (влияет на скорость загрузки); • Shadow DOM (работает в Chrome, Opera и Android); • CSS Modules; • CSS-in-JS styled CSS; • Наш собственный вариант.
  13. Шаг 1 Закрываем стандартные свойства от внешнего мира. Внутри главного

    враппера виджета нужно нормализовать стили для всех используемых тегов. CSS Normalize, завёрнутый внутрь враппера, плюс секретный кот:
  14. div, span, object, nav, h1, h2, h3, p, a, em,

    img, strong, ul, li, fieldset, form, label, legend, nav, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, footer, header, hgroup, section, input, textarea, select, *::before, *::after, & { float: none; box-sizing: border-box; margin: 0; padding: 0; border: 0; background: none; background-color: transparent; box-shadow: none; vertical-align: baseline; text-align: left; text-indent: 0; text-transform: none; text-shadow: none; white-space: normal; letter-spacing: 0; font: inherit; font-style: normal; font-size: 100%; line-height: 1; position: initial; } 01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24
  15. Шаг 2 Делаем наши свойства сильнейшими. Для того, чтобы получить

    самые сильные селекторы, используем при сборке в прод PostCSS-importantly.
  16. Что мы сделали • Wrapper CSS reset; • PostCSS Importantly;

    • gulp-class-prefix. .mewtwo-widget .mewtwo-flights-origin { position: relative!important; min-width: initial!important; max-width: initial!important; display: inline-block!important; margin-right: 1%!important; width: 19%!important; vertical-align: top!important; } 01. 02. 03. 04. 05. 06. 07. 08. 09.
  17. • Кастомизируемые цвета в SVG: - Определять их в monk-шаблоне;

    - CSSX в js. • SVG с логотипами в отдельном файле 7kb. SVG и логотипы
  18. • script + div#id (div.class, div[role], etc). <div id="widget"></div> <script

    src="//travelpayouts.com/widget" async></script> Как можно вставить виджет 01. 02.
  19. • script + div#id (div.class, div[role], etc); • script. <div

    id="widget"></div> <script src="//travelpayouts.com/widget" async></script> Как можно вставить виджет 01. 02.
  20. Inline js params <script> const WidgetParams = { width: '100%',

    border_radius: 2, show_logo: true, show_hotels:true } </script> <script src="//www.travelpayouts.com/widget" async></script> Как передать параметры 01. 02. 03. 04. 05. 06. 07. 08. 09.
  21. Кэшировать выбранные параметры прямо в код виджета по хэшу с

    возможностью их переопределения инлайновым js Как передать параметры
  22. <script charset="utf-8" type="text/javascript"> window.TP_FORM_SETTINGS = window.TP_FORM_SETTINGS || {}; window.TP_FORM_SETTINGS["1d8b372abc912411e4f5d247d117990d"] =

    { "border_radius": "2", "width": 550, "show_logo": true, "show_hotels": true }; </script> <script charset="utf-8" src="//www.travelpayouts.com/widgets/ 1d8b372abc912411e4f5d247d117990d.js?v=1062" async></script> Как передать параметры 01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11.
  23. Айфреймы • Полная изоляция контекста; • Отсутствие проблем с кросс-доменными

    запросами. Плюсы: • Низкая скорость загрузки; • Невозможность выйти за границы айфрейма; • Сложность кастомизации для веб-мастера. Минусы:
  24. Айфреймы • Все попапы должны уместиться внутри айфрейма; • Подстраивать

    высоту айфрейма под высоту контента; • Настроить передачу событий между айфреймом
 и документом.
  25. Настройка виджета • Генерация кода для вставки; • Сохранение настроек

    виджета и сброс кэша; • Обновление демо-виджета
 на лету.
  26. Виджеты • Следите за размером дистрибутива; • Изолируйте CSS; •

    Предотвращайте возможность конфликта версий
 js-библиотек; • Разрабатывайте виджеты, моментально готовые к работе после загрузки; • Помните про iframe и локализации; • Делайте максимально простой код для вставки.