Как развивать
UI библиотеку
не ломая её
Артур Удалов (Mail.RU Group)
UI библиотека Почты Mail.RU
• 15+ разработчиков в почте
• Облако и другие проекты
• Каждый может сделать commit
2
3
Микросервисы
• Отдельный URL
• Iframe или отдельная страница
• Свой репозиторий
4
5
6
7
8
9
Проблемы
• Обновление требует много времени
• Скрытые баги
• Страшно вносить изменения
10
В чём причина?
Или кто виноват?
11
12
Процесс разработки
13
Процесс разработки
14
Методологии разработки
15
Методологии разработки
• TDD – Test Driven Development
16
Методологии разработки
• TDD – Test Driven Development
• ПНХДД – Потом Напишем иХ Дривен Девелопмент
17
• TDD – Test Driven Development
• ПНХДД – Потом Напишем иХ Дривен Девелопмент
• ПДР – Пофиг Дривен Ревью
18
Методологии разработки
Из чего состоит UI библиотека?
62%
75%
61%
49%
38%
25%
39%
51%
SEMANTIC UI REACT TOOLBOX ANT DESIGN MAIL.RU TOOLKIT
JavaScript CSS
19
BEM в Почте Mail.RU
• BEM-схема именования классов
• BEM-файловая структура
• ENB сборщик
20
Отступления от BEM
• Переопределяем стили на уровне проекта
• Влияем одними блоками на другие
• Отступы и прочие «внешние» стили блоков
21
Недостатки процесса
• Разработка в рамках сервиса
• Огромные merge request
• Субъективные требования к тестам
• Нет тестов на CSS
• Неправильный BEM
22
Как тестировать CSS?
Тестирование скриншотами
23
BackstopJS
• Простейшая конфигурация
• Работает напрямую с Headless Chrome
• Легко запустить локально
• Визуальные отчёты
24
BackstopJS
25
Что скриншотить?
26
React Storybook
27
React Storybook
28
React Storybook
29
… /iframe.html? …
30
Генерация сценариев
31
React Storybook
• Разработка библиотеки отдельно от проектов
• Hot Module Replacement из коробки
• Огромное количество плагинов
• Генерация сценариев
32
Используйте Docker
• Одинаковые результаты в любом окружении
• Один образ в CI и локально
• Используйте наш образ:
33
Рекомендации к вёрстке компонентов
• CSS-модули или аналог
• className и style не пробрасываются внутрь
• Не задавайте отступы у компонентов
• Не меняйте св-во display у компонентов
34
Ревью скриншотов
35
• Изменение скриншотов при каждом изменении CSS
• Избегайте менять и удалять скриншоты
• Согласуйте скриншоты с дизайнерами
• Не верьте своим глазам
• Соблюдайте методологию
Как тестировать JavaScript?
Unit-тесты, Статический анализ
36
Средства для статического анализа
• Webpack
• ESLint
• TSLint
• Flow
• TypeScript
37
38
Test Driven Development
Красный
ЗеленыйРефакторинг
39
test('Button', () => {
test('должен навешивать обработчик onClick', () => {
const onClick = jest.fn();
const result = shallow(
<Button
onClick={onClick}
/>,
);
result.find('button').simulate('click');
expect(onClick).toHaveBeenCalled();
});
});
40
describe('Button', () => {
test('должен навешивать обработчик onClick', () => {
const onClick = jest.fn();
const result = shallow(
<Button
onClick={onClick}
/>,
);
result.find('button').simulate('click');
expect(onClick).toHaveBeenCalled();
});
});
41
Coverage 100%
42
Ревью тестов
• Тесты на всё что не видно на скриншоте
• 100% coverage
43
Итог
44
Результат
• Комплексное тестирование для всего кода
• Разрабатываем библиотеку в Storybook
• Тратим минимум времени на тесты
• Пишем правильный CSS
• Знаем как всё это ревьювить
45
Нерешенные проблемы
• Устаревшие браузеры без Selenium не протестировать
• Масштабирование BackstopJS
• Внедрение подхода в сами микросервисы
46
Вопросы?
47
Контакты
• Артур Удалов
• Telegram: @audalov
• E-Mail: a.udalov@corp.mail.ru
48

Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)