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

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

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for FrontFest FrontFest
November 21, 2017

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

Avatar for FrontFest

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 и локализации; • Делайте максимально простой код для вставки.