Священный грааль React в Java · Зачем этот доклад? •...

103
Священный грааль: React в Java Олег Коровин ok.ru/madcow vk.com/madcow 1 Новый фронтенд в Одноклассниках

Transcript of Священный грааль React в Java · Зачем этот доклад? •...

Page 1: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Священный грааль:React в Java

Олег Коровинok.ru/madcowvk.com/madcow

1

Новый фронтенд в Одноклассниках

Page 2: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

2

Page 3: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Зачем этот доклад?

• Показать переход от старого стека к новому с GraalVM

• Продемонстрировать путь миграции

• Мотивировать разработчиков

3

Page 4: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Часть 1 Предыстория

4

Page 5: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

5

Page 6: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

6

2006

Page 7: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

7

Page 8: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

1 000 000Пользователей

8

Page 9: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

9

Page 10: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

10

Page 11: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

11

Время шло

Page 12: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

12

Page 13: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

13

Page 14: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

14

2018

Page 15: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

15

1

Page 16: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

16

Page 17: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

На клиенте

• GWT

• jQuery

• DotJs

• RequireJs

• …

17

Page 18: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

18

Page 19: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Проблемы

• Старые библиотеки

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

• Нет изоморфности

• Нет единого структурированного приложения на клиенте

• Плохая отзывчивость

• Недостаточный инструментарий

• Большой порог входа

• …

19

Page 20: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Требования к решению

• Изоморфный код для UI

• Плавный переход (миграция)

• Серверный рендеринг

• У нас не должно быть усложнения эксплуатации

20

Page 21: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Почему серверный рендеринг?

21

Page 22: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

22

Наш любимый пользователь

Page 23: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

23

В деревне Кужепятовка

100500км от МКАД

4G

Page 24: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

24

Если будет серверный рендеринг

Page 25: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

25

Если не будет серверного рендеринга

Page 26: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

26

Если не будет серверного рендеринга

Page 27: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

27

Пользователи в печали

Page 28: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Часть 2 Поиск решения

28

Page 29: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Концепция решения - виджеты

29

Page 30: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

30

Page 31: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Как работает сервер сейчас

31

Page 32: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Как работает сервер сейчас

32

< 200ms

one-nio - бинарный протокол https://github.com/odnoklassniki/one-nio

HTTP

one-nio

< 1msHTML

WEB API

Page 33: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Что делать?

33

Page 34: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

34

Page 35: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

35

Page 36: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

36

Kotlin - концепт

клиент сервер

код на js код на java

компонент

Логика компонента на Котлине

шаблонизатор на js

шаблонизатор на java

XML шаблон

Page 37: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Почему не Kotlin

• еще 1 язык в системе

• примитивный компилятор в JS

• поддержка 2х рантаймов

• высокий порог входа

• возможные сложности с наймом людей

37

Page 38: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

38

Page 39: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

39

Page 40: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

NodeJS

4040

API

WEBWEB

one-nio http

http

Page 41: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Почему не NodeJS

41

• HTTP транспорт - медленно

• Cериализация/десериализация - доп нагрузка, задержка, сложность

• Еще один компонент - риски эксплуатации

Page 42: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

WEB

А можно ли запустить JS в JVM?

42

• Простая инфраструктура

• Нет накладных расходов

Page 43: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Почему не V8

43

• Сложность эксплуатацииWEB

Page 44: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Nashorn

Rhino

GraalVM

JS рантаймы в JVM

44

• Всё на JVM

• Java-JS взаимодействие

• Безопасный рантайм

• Компилятор на Java

Page 46: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

https://www.graalvm.org

46

Page 47: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

47

Page 48: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

https://reactjs.org/

48

Page 49: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

GraalVM + React

• Нет поддержки типов в JS

• Риски эксплуатации GraalVM

-

49

• Java + JS

• Сообщество

• Низкий порог входа

• Эксплуатация не усложнилась

• Найм сотрудников

+

Page 50: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Часть 3 Запуск React в GraalVM

50

Page 51: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Как GraalVM работает с JS

51

Page 52: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

JS Context

52

JS Context

JAVA

global

Context context = Context.create("js");

//получаем global данного контекста Value js = context.getBindings("js");

Context context = Context.create("js");

//получаем global данного контекста Value js = context.getBindings("js");

Page 53: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Context context = Context.create("js");

//получаем global данного контекста Value js = context.getBindings("js"); //можем читать из global Value load = js.getMember("load");

//можем вызвать функцию из контекста load.execute(pathToModule);

//можем выполнить код в данном контексте context.eval("js", someCode);

//можем читать из global Value load = js.getMember("load");

//можем вызвать функцию из контекста load.execute(pathToModule);

//можем выполнить код в данном контексте context.eval("js", someCode);

JS Context

53

JAVA

JS Context

global

load() app.jseval()

Page 54: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

JS Context

54

Context context = Context.create("js");

//получаем global данного контекста Value js = context.getBindings("js"); //можем читать из global Value load = js.getMember("load");

//вызываем функцию из контекста load.execute(pathToModule);

//можем выполнить код в данном контексте context.eval("js", someCode);

//можем записать в global js.putMember("serverProxy", serverProxy); //можем записать в global js.putMember("serverProxy", serverProxy);

//можем читать из global Value app = js.getMember("app");

JAVA

JS Context

global

load() app.jseval()

js datajava data

Page 55: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Серверный рендеринг JS - концепт

55

Page 56: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

WEB

56

Серверный рендеринг JS - концепт

Java Functions render()

hello-world.js

Context

Page 57: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

WEB

57

Серверный рендеринг JS - концепт

HTTP

HTMLAPI

data

dataHTML

Шаблонизатор

render(data)

Page 58: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Серверный рендеринг JS - реализация

58

Page 59: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

WEB

59

Серверный рендеринг JS - реализация

HTTP

HTML

API

dataШаблонизатор

Очередь

<custom-tag />

Java Thread Pool

HTM

L

Page 60: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

CPU

CPU

CPU

CPU

Почему пул контекстов - это хорошо?

60

Java Thread Pool

Java data

Thread

Thread

Thread

Thread

Page 61: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Конфигурация UI фреймворка

61

Page 62: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...
Page 63: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Архитектура приложений

63

Page 64: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Архитектура приложений

64

Store (MobX)

Controller

Component

MVC

Приложение в DOM узле

Attributes

API

Events

Page 65: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

React Engine

65

сервер клиент

java runner js runner

app engine

приложение

Page 66: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Движок приложения

66

• Инициализирует приложение• Связывает приложение с дом узлом• Предоставляет

• единое апи для рендеринга и уничтожения приложения

• сервисы локализации, настроек, пр..

Page 67: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Информация о приложении

{ "events-calendar": { "bundleName": "events-calendar", "js": "events-calendar_h4h5m.js", "css": "events-calendar_h4h5m.css" } }

67

Page 68: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Запуск приложения на клиенте

<events-calendar data-module="react-loader"

data-bundle="events-calendar.js"

date=".." marks="[{..}]"

... />

68

Page 69: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Как запускать код?

69

Page 70: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Как запускать реальный код?

70

js

сервер клиент

? webpack

Page 71: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Как запускать код в GraalVM?

71

• Транспайлить TS в JS, как для NodeJs• Собирать вебпаком, как для клиента

Page 72: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Методы с разной имплементацией на сервере и клиенте

72

Page 73: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Методы с разной имплементацией

73

function

приложение

сервер клиент

Page 74: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Alias

resolve: { alias: { "./CfgImpl": folders.projects("core", "cfg", "CfgImplServer.ts") } }

74

Page 75: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

2 конфига - 2 сборки?

75

Page 76: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Конфигурация Webpack для запуска jsна сервере и клиенте

76

Page 77: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Что есть в исходниках?

77

apps

сервер клиент vendors mobxreact

core core-server core-client

Page 78: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Как надо собирать

78

• Возможность сконфигурировать отдельно сборку каждой из частей

• Проставить зависимости между ними

• Собирать все за 1 раз

Page 79: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

app

core

vendor

Сборка по частям - мультиконфигурации

79

vendor.js

core.js

app.jsapp.jscore.jsvendor.js

core.jsvendor.js

vendor.js

Page 80: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

DllPlugin и DllReferencePlugin

80

https://webpack.js.org/plugins/dll-plugin/

app

core

vendor vendor.js

core.js

app.jsapp.jscorevendor

core.jsvendor

vendor.js

Page 81: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Стадии сборки WebpackАктивно применяются

1. HashedModuleIdsPlugin: При сборке бандла в качестве идентификатора модуля используется хэш, вместо инкрементирующегося счётчика.

2. DllPlugin: В процессе сборки генерируется файл-манифест, содержащий список экспортируемых классов данной стадии

3. DllReferencePlugin: Используя файл-манифест предыдущей стадии(-й) позволяет импортировать общий класс

4. webpack-merge: Позволяет склеивать конфигурацию из множества различных кусочков

0я стадия сборки. Сторонние библиотеки.

• 0/dll.js — Параметры DllPlugin, используемые на этой стадии • 0/stage.js — Базовая конфигурация • 0/vendors.js — Список сторонних библиотек, включаемых в бандл • 0/entries.js — Комбинирует кусочки для webpack-merge

1я стадия сборки. Базовые классы (зависимые от среды выполнения).

• 1/dll.js — Параметры DllPlugin, используемые на этой стадии • 1/stage.js — Расширение конфигурации • 1/core.js — Список базовых классов • 1/core-server.js — Бандл классов для работы на сервере (GraalJS) • 1/core-client.js — Бандл классов для работы на клиенте (Браузер) • 1/entries.js — Комбинирует кусочки для webpack-merge

2я стадия сборки. Проектные классы.

• 2/stage.js — Расширение конфигурации • 2/projects.js — Список генерируемых бандлов • 2/plugins.js — Список используемых плагинов • 2/loaders.js — Список используемых загрузчиков • 2/entries.js — Комбинирует кусочки для webpack-merge

81

Page 82: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Доставка ресурсов

82

Page 83: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Использование в коде

const pkg = l10n('smiles');

<div> Текст: { pkg.getText('title') } </div>

83

Page 84: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Сервер

84

запрос админка функция

Page 85: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Методы Java для JS

public class ServerMethods { ...

/** * Получаем текст в виде строки */ public String getText(String pkg, String key) { ... }

... }

85

Page 86: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Методы Java для JS

86

//добавляем объект с методами Java в поле контекст js.putMember("serverMethods", serverMethods);

Page 87: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Методы Java в JS

function getText(key: string): string { return global.serverMethods.getText(pkg, key); }

87

Page 88: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Клиент

88

запрос админка функция

Page 89: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Клиент

89

запрос админка кэш

кэш функция

11Mb

Page 90: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Клиент

90

пакеты запрос бандл

Page 91: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Поиск текстов и настроек в коде

const pkg = l10n('smiles');

<div> { pkg.getLMsg('title') } </div>

91

Page 92: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Результат работы webpack плагина{ "some-tag": { "pkg": [ "smiles", "sadness" ], "cfg": [ "config1", "config2" ], "bundleName": "some-tag", "js": "some-tag.js", "css": "some-tag.css" } }

92

• Watcher

Page 93: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Итоги

93

Page 94: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Время рендеринга реакт-приложений

94

•Простая функция ~ 1 мкс

•Компоненты ~ 0.5-6 мс

Page 95: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Что удалось сделать

95

• Запустить JS на сервере, там где это казалось невозможным )

• Можем писать изоморфный код для UI

• Начали использовать современный стек для фронтенда, со всеми его плюсами

• Появилась единая современня платформа для создания UI

• Начали плавный переход (миграцию)

Page 96: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

При этом

96

• Не произошло усложнения эксплуатации

• Не ухудшили серверный рендеринг

Page 97: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

97

Page 98: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

GraalVM — это веб стандарт?

98

Page 99: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

PHP в GraalVM

99

https://github.com/oracle/graal/issues/361

Page 100: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

100

Да! GraalVM — будущий веб

стандарт!

Page 101: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

101

Page 102: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

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

102

Page 103: Священный грааль React в Java · Зачем этот доклад? • Показать переход от старого стека к новому с GraalVM ...

Священный грааль:React в Java

Олег Коровинok.ru/madcowvk.com/madcow

103

Новый фронтенд в Одноклассниках