Когда проект делает один разработчик — все просто. Когда над ним работает небольшая команда, можно синхронизироваться и договориться. А вот когда проектов (сайтов и приложений) становится много, и над ними трудится множество команд с перекрестной функциональностью и смежными зонами ответственности, все становится сложным и запутанным.
Я расскажу о своем виденье архитектуры фронтенда, какой она должна быть, чтобы обеспечить её масштабируемость. На основе своего опыта и проблем, с которыми сталкиваются большие проекты.
Видео: https://www.youtube.com/watch?list=PLknJ4Vr6efQFtZmsXmGG64Rz_PHrcXCBL&v=z9y6PNC2FL0
2. Работаю в Avito
Open source:
basis.js, CSSO,
component-inspector,
csstree, rempl и другие
github.com/lahmatiy
twitter.com/rdvornov
rdvornov@gmail.com
15. В чем разница
• Проект-команда
• Плохая предсказуемость доставки фичи,
сложно приоритезировать, разное понимание
• Фича-команда
• Много разных интеграций, но хорошая
предсказуемость и проработка фич
10
16. В чем разница
• Проект-команда
• Плохая предсказуемость доставки фичи,
сложно приоритезировать, разное понимание
• Фича-команда
• Много разных интеграций, но хорошая
предсказуемость и проработка фич
10
Было
Сейчас
19. Проблемы больших продуктов
• Больше «проектов» – больше точек интеграции
• Увеличивается число команд с одной кодовой
базой
• Постоянно усложняется (новые фичи)
• Растет кодовая база и техдолг (легаси)
• ...
12
20. Как будем лечить
• Экосистема страниц
• Организация процессов разработки
• Платформа
13
23. Типовые задачи
• Лейаут страницы
• Управление слоями
• Загрузка и управление зависимостями
• Источники данных (модели, нотификация)
• Персистентное хранение данных
• Транспорт
• Роутинг
• и т.д.
16
28. Layout
Slot 1 Slot 2 Slot N
...
Core
Block 1 Block 2 Block N
...Plugin 1 Plugin 2 Plugin N
29. Layout
Slot 1 Slot 2 Slot N
...
Core
Block 1 Block 2 Block N
...Plugin 1 Plugin 2 Plugin N
Common Public API
30. Layout
Slot 1 Slot 2 Slot N
...
Core
Block 1 Block 2 Block N
Plugin Method 1 Plugin Method 2 ...
...Plugin 1 Plugin 2 Plugin N
Common Public API
31. Layout
Slot 1 Slot 2 Slot N
...
Core
Block 1 Block 2 Block N
Plugin Method 1 Plugin Method 2 ...
Browser API
...Plugin 1 Plugin 2 Plugin N
Common Public API
32. Layout
Slot 1 Slot 2 Slot N
...
Page Ecosystem
Core
Block 1 Block 2 Block N
Plugin Method 1 Plugin Method 2 ...
Browser API
...Plugin 1 Plugin 2 Plugin N
Common Public API
44. Что может быть
• Запрос к серверу
• Данные из кеша
• Синхронизация между закладками
• SSE/WebSocket/ServiceWorker/etc
• ...
23
45. Что может быть
• Запрос к серверу
• Данные из кеша
• Синхронизация между закладками
• SSE/WebSocket/ServiceWorker/etc
• ...
23
Progressive
enhancement
46. Реализация экосистемы может ...
• Меняться (подходы и технологии)
• Различаться от проекта к проекту
• Совершенствоваться со временем
• ...
• Блокам/компонентам все равно
24
47. Плюшки
• Стенд для разработки блока
• Моки без костылей
• Реализации под «среду»
• браузер
• серверный рендеринг
• тесты
25
50. Зачем?
• Переиспользование блоков без адаптации к API
• Используем подходящую реализацию ядра, в
зависимости от среды
• Проще новые интеграции (меньше учить)
28
52. «Нет» монолитам!
• Подключение (с динамической подгрузкой)
дополнительной функциональности в ядро по
принципу плагинов
• Интерфейсы декомпозируются на логические
блоки, с динамической подгрузкой (включая
зависимости) и обновлением
30
53. Подход подразумевает
• Функциональность (API) экосистемы расширяется
(догружается) по мере потребностей блоков
• Разные версии одних и тех же зависимостей в
рамках одного окружения (страницы)
• Блоки взаимодействуют только с публичным API
• Креш блока не тянет за собой все остальное
31
54. Точки отказа
• Ядро – единственная критическая часть,
ничего не будет работать
• Плагин ядра – не будут работать плагины и
блоки, которые от него зависят
• Блок – проблемы блока никого не касаются
32
65. Action plan
• Проблема, баг или вопрос?
• Определяется релевантный компонент,
с которым это связано и его владелец
• Направляется запрос владельцу
• Владелец решает вопрос сам или переадресует
другим, но контролирует его разрешение
43
68. Независимость команд
• Модульность: блоки (функциональность)
изолируются в пакеты
• Могут использовать собственную версию
зависимости, апгрейдится в удобное время
• Поддержка более мягких интеграций
• Автоматизация тестирования
46
69. Типы интеграции
• Жесткая интеграция – изменения кода компонента
(требуется публикация пакета, пересборка и релиз
зависимых модулей и проектов)
• Конфигурационная интеграция – изменение
конфигурации экземпляра компонента (требуется
пересборка и релиз модуля и проекта)
• Мета интеграция – конфигурация блока описывается и
хранится вне кода (не требует пересборки и релиза)
47
78. Инкрементальный рефакторинг
• Возможность не делать все сразу
• Рефакторинг не больше недели → релиз
• Толерантность к легаси – старое должно
продолжать работать без приложения усилий
(консервация до лучших времен)
56
95. По моему скромному опыту:
настроить проект с нуля, имея опыт,
занимает несколько часов, не считая поддержки
72
96. Инфраструктура – не всегда готовое
• Unit-тестирование скриншотами: преодолеваем
звуковой барьер – Роман Дворнов
видео, расшифровка
• Скриншоты как сервис – Сергей Мелюков
видео
73