Как мы разрабатываем новый фронтенд / Филипп Нехаев...

61
Как мы разрабатываем новый фронтенд Tinkoff.ru Филипп Нехаев Архитектор веб-интерфейсов Тинькофф банк

Upload: ontico

Post on 16-Apr-2017

488 views

Category:

Engineering


3 download

TRANSCRIPT

Page 1: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

Как мы разрабатываемновый фронтендTinkoff.ruФилипп НехаевАрхитектор веб-интерфейсовТинькофф банк

Page 2: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

2

1. О наших задачах

2. Обзор стэков

3. Переиспользование

4. Оптимизация

5. Сборка и деплой

Page 3: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

3

Какие задачи решаем

Page 4: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

Сервер Клиент

2011 сайти Интернет-Банк Java/Spring, JSP, Maven JS, jQuery, Handlebars,

Backbone, Maven/Grunt

Что было раньше

4

Page 5: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

5

• Два UI-слоя Сервер

Java JSP

Клиент

JSHandlebars

Что было раньше

Page 6: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

6

• Два UI-слоя

• Дублирование логикиСервер

Java JSP

Клиент

JSHandlebars

Что было раньше

Page 7: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

7

• Два UI-слоя

• Дублирование логики

• Две группы разработчиков

Сервер

Java JSP

Клиент

JSHandlebars

Что было раньше

Page 8: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

8

• Два UI-слоя

• Дублирование логики

• Две группы разработчиков

• Дорогая поддержка

Сервер

Java JSP

Клиент

JSHandlebars

Что было раньше

Page 9: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

Сервер Клиент

2011 сайти Интернет-Банк Java/Spring, JSP, Maven JS, jQuery, Handlebars,

Backbone, Maven/Grunt

2014 Кошелек JS, Backbone, Handlebars, Bower/Grunt

Что было раньше

9

Page 10: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

Сервер Клиент

2011 сайти Интернет-Банк Java/Spring, JSP, Maven JS, jQuery, Handlebars,

Backbone, Maven/Grunt

2014 Кошелек JS, Backbone, Handlebars, Bower/Grunt

2015 Интернет-Банк v5 JS, Angular, Bower/Gulp

Что было раньше

10

Page 11: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

11

Клиент

JS• Сложно решать задачи SEO и SMM

Что было раньше

Page 12: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

12

Универсальное приложение

Page 13: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

Сервер Клиент

2016 Сайт, Интернет-Банк, Кошелек, Брокеры, 🔜 JS, React, Flux, NPM/Webpack

🏎 Что есть сейчас

13

Page 14: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

14

• SEO и SMMСервер

JS

Клиент

🏎 Что есть сейчас

Page 15: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

15

• SEO и SMM

• Переиспользование 99% кодаСервер

JS

Клиент

🏎 Что есть сейчас

Page 16: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

16

• SEO и SMM

• Переиспользование 99% кода

• Одна группа разработчиков

Сервер

JS

Клиент

🏎 Что есть сейчас

Page 17: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

17

• SEO и SMM

• Переиспользование 99% кода

• Одна группа разработчиков

• Скорость разработки

Сервер

JS

Клиент

🏎 Что есть сейчас

Page 18: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

18

• SEO и SMM

• Переиспользование 99% кода

• Одна группа разработчиков

• Скорость разработки

• Нет монолитности

Сервер

JS

Клиент

🏎 Что есть сейчас

Page 19: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

19

• Реализация Flux

Fluxible

Page 20: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

20

• Реализация Flux

• Используем только Routr и Dispatchr

Fluxible

Page 21: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

21

Сервисы Действия Сторы Компоненты

Доступ к API UI логика

Рендер

Бизнес логика

Распределение по слоям

Page 22: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

22

🌠 Жизнь приложения

Node.js Браузер Интеракция

• Роутинг на подприложения • Поиск редиректов • Независимый контекст • Сериализация состояния

• Создание контекста • Десериализация состояния

• Циклы взаимодействия

Page 23: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

23

Контекст на сервере

Page 24: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

Прогрессивная загрузка

24

Page 25: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

25

Page 26: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

26

Page 27: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

27

import { ACCOUNT_LIST } from '../actions'; import { CLIENT } from '../roles'; accountList.isServer = true; accountList.requiredRoles = [CLIENT];function accountList(context) { return context.service('account/list') .then(payload => context.dispatch(ACCOUNT_LIST, payload));} export default accountList;

Action creator

Page 28: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

28

Переиспользуемые компоненты

Page 29: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

29

Коннектор Чистый компонент

Получают данные из сторов Получают данные из props

Передают данные в чистый компонент через props Рендерит данные в HTML

Обрабатывают callbacks, вызывают действия

Обрабатывают DOM-события, вызывают callbacks

Переиспользуемые компоненты

Page 30: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

30

import { LogoPure } from './LogoPure.jsx'; const UILogo = connect( ['config', 'brands'], ({ brands, config: { brandsBasePath } }) => ({ brands, brandsBasePath }) )(LogoPure);export default UILogo;

Компонент коннектор

Page 31: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

31

Переиспользуемые компоненты

Higher-order Components

Page 32: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

32

⏱ Оптимизация

Page 33: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

33

⏱ Оптимизация на клиентеpure-render

Page 34: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

34

⏱ Оптимизация на клиентеreact-perf

Page 35: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

35

⏱ Оптимизация на клиентеrender-logger

Page 36: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

36

• jsx-no-bind

⏱ Оптимизация на клиенте

Page 37: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

37

• jsx-no-bind

• batched updates

⏱ Оптимизация на клиенте

Page 38: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

38

⏱ Оптимизация на клиентеВизуальное ускорение

Page 39: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

39

⏱ Оптимизация на клиентеВизуальное ускорение

Page 40: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

40

⏱ Оптимизация на сервере

• ES6 Class, NODE_ENV=production – 4x ускорение

Page 41: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

41

⏱ Оптимизация на сервере

• ES6 Class, NODE_ENV=production – 4x ускорение

• Minified React – +2%

Page 42: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

42

⏱ Оптимизация на сервере

• ES6 Class, NODE_ENV=production – 4x ускорение

• Minified React – +2%

• Babel transforms (constant & inline elements) – +10%

Page 43: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

43

⏱ Оптимизация на сервере

• ES6 Class, NODE_ENV=production – 4x ускорение

• Minified React – +2%

• Babel transforms (constant & inline elements) – +10%

• stateless functions – +45%

Page 44: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

44

⏱ Оптимизация на сервере

• ES6 Class, NODE_ENV=production – 4x ускорение

• Minified React – +2%

• Babel transforms (constant & inline elements) – +10%

• stateless functions – +45%

• react-dom-stream – +55%

Page 45: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

45

• Кэширование на уровне страницы

⏱ Оптимизация на сервере

Page 46: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

46

• Кэширование на уровне страницы

• Без sensitive данных

⏱ Оптимизация на сервере

Page 47: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

47

• nginx

Кэш

Page 48: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

48

• nginx

• express-cache-on-demand

Кэш

Page 49: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

49

• nginx

• express-cache-on-demand

• lru-cache

Кэш

Page 50: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

50

Кэш

Page 51: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

51

• Для сервера и клиента

🏢 Сборка

Page 52: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

52

• Для сервера и клиента

• Без переменных окружения

🏢 Сборка

Page 53: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

53

• PM2> pm2 startOrGracefulReload processes.json

🌋 Деплой

Page 54: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

54

• PM2> pm2 startOrGracefulReload processes.json

• Каждый экземпляр на отдельном портуPORT: process.env.PORT + process.env.NODE_APP_INSTANCE

🌋 Деплой

Page 55: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

55

🌋 Деплой

NGINX

Node.js Cluster

Node.js Cluster

NGINX

App

App

App

App

App

App

App

App

Page 56: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

56

🌋 Деплой

NGINX

Node.js Cluster

Node.js Cluster

NGINX

App

App

App

App

App

App

App

App

Page 57: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

57

• Автогенерация демо для компонентов

🌪 Что осталось?

Page 58: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

58

• Автогенерация демо для компонентов

• Разделение на бандлы

🌪 Что осталось?

Page 59: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

59

• Автогенерация демо для компонентов

• Разделение на бандлы

• Ускорение сборки стилей

🌪 Что осталось?

Page 60: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

60

Универсальное приложение – это просто

Page 61: Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)

61

👏 Спасибо за внимание!

[email protected] linkedin.com/in/nehaev fb.com/philnehaev

Дополнительные материалы: goo.gl/ZEpnTU