Фронтенд в Avito · Socket Client • Собственная низкоуровневая...

70
Фронтенд в Avito Александр Лобашев, @limarc

Transcript of Фронтенд в Avito · Socket Client • Собственная низкоуровневая...

Page 1: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Фронтенд в AvitoАлександр Лобашев, @limarc

Page 2: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

1. История фронтенда

2. Разработка и архитектура

3. Система сборки

2

Page 3: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает
Page 4: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

О проекте• Топ-10 сайтов Рунета

• 10 000 000 000 просмотров в месяц

• 70 000 000 уникальных посетителей в месяц

• 600 000 новых объявлений каждый день

• 450 000 новых картинок каждый день

• 750 000 запросов в минуту

4

Page 5: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает
Page 6: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

История фронтенда

6

Page 7: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

2012

7

Page 8: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

0

8

Page 9: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

ВСЕМ ЗАПРАВЛЯЛИ СЕРВЕР-САЙДЕРЫ

9

Page 10: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

2013

10

Page 11: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

11

Page 12: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает
Page 13: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

12Desktop Mobile

13

Page 14: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

1.5

14

Page 15: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Chrome Firefox IE8+Opera Safari

Opera MiniSafari iOS Android Browser 2.x

Symbian OSBrowser

Chrome for Android

15

Page 16: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

2014

16

Page 17: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

17

Page 18: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

О БОЖЕ, SVG КАРТА!

Page 19: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

2

5Desktop

Mobile

1Protools

19

Page 20: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

1.9

20

Page 21: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

2015

21

Page 22: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Мобильная трансформация *

* mobile first22

Page 23: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

11Avito

3Avito Protools

23

Page 24: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Service Worker API

WebSocket API

2.x

24

Page 25: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Service Worker API

25

Page 26: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

service-worker.js

26

3 байта

Page 27: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

27

ЧТО ТЫ ТОЛЬКО ЧТО СКАЗАЛ?!?

Page 28: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

28

Используется для напоминания о добавление сайта на домашний экран

Page 29: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

29

Page 30: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

WebSocket API

30

Page 31: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Socket Client• Собственная низкоуровневая библиотека

• Два транспорта — socket и http

• Поддерживает notify, reconnect, множественные вкладки

• Пока только в приложение Avito Messenger

• Очень скоро на всем проекте Avito

31

Page 32: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Chrome Firefox IE11+Opera Safari

Safari iOS Android Browser 4.x

Chrome for Android

32

Page 33: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Разработка и архитектура

Page 34: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Смутные времена

Page 35: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

/static /a /c /3rdparty 404.css account.css alert.css buttons.css catalog.css firefox.css icons.alert.css

typography.css datepicker.css /i /ic /ip /maps /profile cookie.png

/j /3rdparty /blocks account.js cart.js common.js fees-select.js

/avito

/css

/images

/javascript

35

Page 36: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Как это выглядело• Линейная структура

• Односимвольные наименования

• Много глобальных классов и скриптов

• Отсутствие пакетного менеджера

• Много одинакового кода

36

Page 37: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Проблемы• Много задач — много генерируемого кода

• Команда растет и нужны процессы

• Нет методологий разработки интерфейсов

• Нет правил и стандартов разработки

• Нет код-ревью

• Кошмар фронтенд разработчика

37

Page 38: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

БЫЛО ВСЁ ОЧЕНЬ И ОЧЕНЬ ПЕЧАЛЬНО

Page 39: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Процесс миграции• Создание код-стайла

• Соглашение о наименовании

• Старый код приводим к новому код-стайлу

• Все новое разрабатываем с новым подходом

• Для старого кода — рефакторинг или оставляй как есть

39

Page 40: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Настоящее

40

Page 41: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Архитектура• Собственная методология разработки интерфейсов

• Полностью компонентный подход

• Отдельные компоненты интерфейса (UI)

• Интегрируемые приложения и сервисы

• Автоматическая проверка код-стайла и линтеры

• Обязательный код-ревью

41

Page 42: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает
Page 43: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

/static /avito /apps /components /containers /ui guide.styl /mobile /apps /components /containers /ui guide.styl

Большая версия

Мобильная версия

Приложения и сервисы

Страницы

Гайды

Компоненты

43

Page 44: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Технологии• Код — Stylus и ES6

• Приложения и сервисы (SPA) — Angular + RequireJS, React + Redux, Basis.js

• Внешние зависимости — NPM

• Анализ кода — JSCS, ESLint и Stylint

• Автоматическое код-ревью — Reviewbot, github.com/limarc/reviewbot

44

Page 45: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает
Page 46: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Будущее

46

Page 47: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Планы• Больше фронтенд разработчиков

• Серверный рендеринг на Node.js

• Отказываемся от Angular, больше React + Redux

• Гибридная архитектура обычных компонентов

• Гайдбук интерфейсов для дизайнеров

47

Page 48: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Система сборки

Page 49: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Phing

npm install

Gulp

{% assets %}

Apps Vendors

49

Page 50: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

{% assets %}

50

Page 51: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

.css

.styl

.js

.es6

.svg

HTML?

51

Page 52: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Способ подключения ресурсов на страницу

52

Page 53: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает
Page 54: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает
Page 55: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает
Page 56: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Процесс• Трансформация путей

• добавляется префикс /build для .styl и .es6

• преобразование .styl — .css, .es6 — .js

• Clean-css (скоро CSSO)

• UglifyJS

• Собирается в прекомпиляции шаблонов Twig

56

Page 57: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Сборка в среднем 7-8 минут

57

Page 58: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Меняем Bower на NPM

Page 59: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Зачем?• Два пакетных менеджера — две зависимости

• Необходимы приватные пакеты

• Необходимо кеширование пакетов в связи с блокировками

59

Page 60: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

+ Sinopia

60

Page 61: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

NPM• Один package.json

• Нет пакета на NPM, берем с GitHub

• /node_modules — недоступна в публичной части

• Пакеты для фронтенда собираем в /build/vendor

• Сборка Webpack + умное копирование

61

Page 62: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает
Page 63: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает
Page 64: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Sinopia• Собственный NPM сервер

• Open-source, написан на JavaScript github.com/rlidwka/sinopia

• Легко настраивается, запускается как отдельный сервис

• Поддерживает кэширование и переопределение пакетов

64

Page 65: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает
Page 66: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Заключение

Page 67: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

За этот год мы много экспериментировали,что-то у нас получалось, а что-то не очень!

67

Page 68: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Никогда не сдавайтесь!

68

Page 69: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

69

В следующей году нас станет в два раза больше,

и если вы хотите сделать что-то лучшее для

нескольких миллионов людей, присоединяйтесь avito.ru/company/job

inplacers.ru/avito

Page 70: Фронтенд в Avito · Socket Client • Собственная низкоуровневая библиотека • Два транспорта — socket и h6p • Поддерживает

Спасибо! Вопросы?

70

twitter.com/limarc