|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
Классический способ написания UI как Swing и т.п. - это MVC где есть 2 типа функций рендеринга - 1) функция которая рендерит начальное состояние UI 2) множество функций обновления UI, которые по реакции на события и обновления модели обновляют UI Так работали наверно 95% всех UI фреймворков во всех языках программирования и 100% в JS. Когда вышел React он произвел революцию, поскольку он не требует создания обработчиков 2го типа, и делает это все сам автоматически (благодаря Reconciliation). С реактом можно выкинуть из проекта большую часть самого сложного кода - всю эту кучу методов которые слушают состояние модели и обновляют UI, и которые раньше надо было писать вручную. В реакте на любое событие - весь UI рендерится с нуля, затем риакт сравнивает старый и новый UI и САМ определяет как изменить старый UI чтобы он стал новым. Про скорость такого подхода, когда на каждое нажатие клавиши в поле ввода - вызывается полная пере-рисовывка всего UI - риакт использует ряд оптимизаций, он умный и в реальности там перерисовывается только изменившийся компонент и его паренты, но это уже второстепенные детали. Итак - Риакт произвел революцию убрав кучу тупого обезьяньего кода. Далее добавились Angular, Vue и Svelte. Они тоже (условно конечно)работают примерно также и убирают необходимость писать тупой обезьяний код. Тем не менее - Реакт не решает второй огромной проблемы - распределенной системы. Поскольку в отличии от скажем PHP или Сервлетов где вся логика на сервере, с Риактом теперь она у нас размазана по Серверу и Браузеру, и нам надо дублировать модели, создавать АПИ и коммуникацию между сервером и клиентом иметь разные валидации на клиенте и сервер. Опять приходится поддерживать кучу тупого обеьзяньего кода. И тут появился Elixir Phoenix LiveView - по словам создателя сделал он его совершенно случайно, подумав а что если переместить код реакта на сервер. Переместить весь клиентский код на риакте из Браузера на сервер, а события (как нажатие клавиши) сериализовать и передавать на сервер по вебсокету, и расчет реакта (работающего на сервере) об изменении HTML DOM также сериализовать и отправлять в браузер. Соответственно браузер превращается во что-то типа Терминала или Удаленного Стола. Клиентское приложение на риакте в реальности работает на сервере (стейтфул), там-же на сервере рендерится ХТМЛ, а в браузер просто посылается его копия. Т.е. ни кода ни логики в браузере почти нету. (Не путать с server-side react rendering, progressive rendering, enchancement и т.п. - это не имеет ничего общего с этим подходом и нужно для ускорения открытия страницы и загрузки риакта, там риакт рендерится на сервере только для загрузки а затем запускается на браузер и работает дальше как обычный риакт, в то время как Elixir Phoenix LiveView - риакт вообще никогда в браузер не загружает). Как оказалось подход работает неожиданно хорошо https://dockyard.com/blog/2018/12/12/phoenix-liveview-interactive-real-time-apps-no-need-to-write-javascript (там тоже ряд оптимизаций кому интересно посмотрите на ютубе презентацию где детально рассказывается как все работает) Нахрена все это нужно? Потому-что убирается распределенная система, выкидывается больше половины кода, поскольку больше нет раделения на клиентский и серверный код, нет проблемы N+1 запросов, не нужно АПИ и т.п. Короче вопрос - что из этого есть в Java / Kotlin П.С. Не упоминать GWT, Vaadin, kweb, Wicket, teavm и т.п. Должно быть 2 веши 1) Декларативный рендеринг, без необходимости писать вручную как изменять UI на реакцию на события 2) Фреймворк должен работать на сервере, не на клиенте 3) (думаю само собой понятно, но все-же) Это не Servlet, Spring, JSP, JSF и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 14:51 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
Просьба не отвлекаться от дискуссии вопросами о производительности, задержки по сети и нагрузке на сервер при таком подходе, эти проблемы существуют, но если их интересно обсудить - лучше создать отдельный топик, не в этом. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 14:59 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
Нифига не понял. Но например Oracle ADF - все программируется на сервере, JavaScript вообще не нужен, он под капотом контролов спрятан. Подозреваю остальные Java Server Face фраймворки примерно так же. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 15:12 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
Это классический MVC (контроллера для простоты), есть модель - счетчик, метод который рендерит страницу, и метод который обновляет страницу когда меняется модель. Так работает Swing, и все старые JS фреймворки до реакта. Код: java 1. 2. 3.
А вот так будет выглядеть код на Риакте (реакт имеется ввиду концепция, не фреймворк React.JS). Кусок обезьяньего кода выкинули on_change, но работать будет все так-же интерактивно как и раньше. Потому-что риакт сам знает когда нужно выполнить код обновления UI и сделает этот вызов "document.body.innerHtml = count" автоматом. Код: java 1. 2.
А Elixir Phoenix LiveView или серверный реакт - это когда все это запущено на сервере, на JVM с Java/Kotlin но при этом показывется в браузере и работает так-же интерактивно и быстро, словно это клиентское приложение сделанное на риакте. Серверный риакт - это как браузер который запущен на сервере (на самом деле только умный алгоритм рассчета изменений дерева компонентов), все вычисления и UI крутится внутри сервера, а в реальный браузер транслируется просто копия его текущего HtML, типа как удаленный рабочий стол, или старые десктопы-терминалы на майнфреймах. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 15:29 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
(контроллера для простоты убран) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 15:30 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
авторНо например Oracle ADF - все программируется на сервере, JavaScript вообще не нужен, он под капотом контролов спрятан. Подозреваю остальные Java Server Face фраймворки примерно так же. Там нужно вручную писать код - как менять UI в ответ на события. Это старые фреймворки. Собственно "react" называется так из-за реактивности - словно там есть магия когда изменения модели автоматически, реактивно, сами по себе меняют интерфейс. Как в Excell - ты изменил код в одной ячейке - и в других зависимых ячейках все автоматом поменялось. Реакт делает то-же самое для интерфейса, обновляет его автоматически. А в фреймворках предыдущего поколения - Java Server Face и еще сотен других - это все надо писать вручную. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 15:37 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
private авторНо например Oracle ADF - все программируется на сервере, JavaScript вообще не нужен, он под капотом контролов спрятан. Подозреваю остальные Java Server Face фраймворки примерно так же. Там нужно вручную писать код - как менять UI в ответ на события. Это старые фреймворки. Собственно "react" называется так из-за реактивности - словно там есть магия когда изменения модели автоматически, реактивно, сами по себе меняют интерфейс. Как в Excell - ты изменил код в одной ячейке - и в других зависимых ячейках все автоматом поменялось. Реакт делает то-же самое для интерфейса, обновляет его автоматически. А в фреймворках предыдущего поколения - Java Server Face и еще сотен других - это все надо писать вручную. В Oracle ADF можно вообще код не писать. Компоненты на экране (описание в XML) сами рендерятся и отображают данные (из базы). Ну и само по себе ничего не бывает ))). Вполне есть компоненты, которые в онлайн режиме умеют data pump с сервера приложений (базы) делать (например графики/индикаторы в реальном режиме времени для BI или Business Process Analysis), но я с ними детально не разбирался (использовал для индикации метрик, кинул на экран они и заработали) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 15:47 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
Очередное изобретение колеса 1) функция которая рендерит начальное состояние UI Нормальные Framework'и все же работают как компоненты (JSF). Положил компонент, он что-то отображет. Собирать HTML руками.... что же это за фраймворк такой ((( 2) множество функций обновления UI, которые по реакции на события и обновления модели обновляют UI Что значит "обновления модели обновляют UI" мне не понятно. Есть у меня данные в базе, их поменяли с другого компьютера, кто и что должен обновлять и зачем? Обычно изменение UI происходят по причине изменения состояния со стороны пользователя. Например пользователь очистил какое-то поле, другие поля нужно задизайблить. Ну да, это нужно кодировать. Зависимым контролам нужно свойства Enabled менять с True на False и наоборот. Можно на Java, можно формулами (в ADF можно без Java, просто в свойство Enabled написать формулу ссылающуюся на какие-то данные, но мы старались делать на Java - нам так было понятнее). А в фреймворках предыдущего поколения - Java Server Face и еще сотен других - это все надо писать вручную. Какое-то жуткое лукавство. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 16:01 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Очередное изобретение колеса 1) функция которая рендерит начальное состояние UI Нормальные Framework'и все же работают как компоненты (JSF). Положил компонент, он что-то отображет. Собирать HTML руками.... что же это за фраймворк такой ((( 2) множество функций обновления UI, которые по реакции на события и обновления модели обновляют UI Что значит "обновления модели обновляют UI" мне не понятно. Есть у меня данные в базе, их поменяли с другого компьютера, кто и что должен обновлять и зачем? Обычно изменение UI происходят по причине изменения состояния со стороны пользователя. Например пользователь очистил какое-то поле, другие поля нужно задизайблить. Ну да, это нужно кодировать. Зависимым контролам нужно свойства Enabled менять с True на False и наоборот. Можно на Java, можно формулами (в ADF можно без Java, просто в свойство Enabled написать формулу ссылающуюся на какие-то данные, но мы старались делать на Java - нам так было понятнее). А в фреймворках предыдущего поколения - Java Server Face и еще сотен других - это все надо писать вручную. Какое-то жуткое лукавство. Совсем с react не знаком? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 16:07 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
Мы уходим от дискуссии, как работает риакт я описал, кто не знаком с риактом и если интересны детали - они есть на официальном сайте реакта. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 16:12 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
Что касается серверного реакта - то (на мой взгляд) идея полнейшее дерьмо. Помимо того что возникают очевидные проблемы с производительностью, то еще теряется преимущество адаптации контента под другие платформы. Что если я хочу использовать тот же бэкэнд для мобильного приложения и веб-приложения? Терминала, умных часов или телевизора? На кой вообще этот html. А вот react на клиентской стороне - вполне жизнеспособен, не совсем понял описанных проблем с ним. То что модель дублируется, это все? Не знаю как в котлинах и java, а например на скала можно использовать обычную скалу на сервере и scalaJS на клиенте, и модель будет правиться только в одном shared модуле. Кстати scalaJS имеет поддержку react, только он к тому же еще и становится типизированным. Я не делал production-ready проектов на этой связке и лично мое мнение что там еще конечно сыровато, но вполне себе вариант. Я давно не получал такого кайфа от кодинга веб-приложения(для собственных нужд), когда фронт-энд типизированный на том же языке, что и бэкэнд и это не ублюдочный яваскрипт. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 16:14 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
Хорош подход или нет - зависит от задачи, понятно что если приложение посещают десятки миллионов и бабло льется рекой - нужно делать нативно. Но если это скажем заказные проекты, сокращение кода раза в 3 - и соотв. сроков, усилий и затрат - это хороший вариант. Про варианты с Kotlin в браузере да есть варианты, но вопрос в том как полностью убрать код на клиенте . ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 16:37 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
забыл ник Совсем с react не знаком? Знаком, делал с его помощью админку года 4-и назад. Только смысл сравнивать теплое и мягкое? JavaScript с клиентским HTML DOM'ом и, например, более-менее нормальные framework'и ну и, то, что в более-менее нормальных фреймворках для рендеринга нужно писать какой-то код - лукавство. Что MS Access, что Oracle Forms, что Oracle ADF - положил компонент, как он рендерится, дело исключительно фраймворка. Ну сделали нечто __похожее__ на client react на стороне серверу - ну молодцы. Еще одним сайтом с гордой вывеской "мы изобрели новый, самый лучший и молодежный фраймворк" стало больше. На деле, все по отдельности уже было лет 15-20 назад Например с их сайта: We’ve heard for years that server-rendered HTML is a thing of the past for rich applications, and besides, how fast can an application be if it has to render the entire template on the server on every change? Жуткое лукавство. then only the dynamic parts that have changed on update Что древний Oracle OAF, что Oracle ADF - ровно так же посылают только изменения. По скорости - проблема со скоростью в Java EE не рендеринг, а жуткое потребление памяти и тормоза на бинах IMHO powered applications are stateful on the server with bidrectional communication via WebSockets Опять таки не новость. Такие библиотеки существуют уже лет 10-15 Если я не ошибаюсь (сам не работал, только доки просматривал) https://ru.wikipedia.org/wiki/ADempiere https://ru.wikipedia.org/wiki/ZK IMHO & AFAIK p.s. Называть фремворком нечто, заточенное исключительно под рисование HTML.... б№;%... 2020 год ((( ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 16:50 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
private, Бэк и фронт в одно целое это писать против ветра. Пример - конвейер = разделение труда. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 17:36 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
В ZK-фреймворк нет клиентской части (то что нужно), но в ZK-фреймворке нет реактивности. Изменение UI происходит императивно, за счет прямых манипуляций с компонентами интерфейса, вот кусок кода из его примера, это классический MVC, Swing UI и еще наверно десятка таких-же. Код: java 1. 2. 3. 4. 5. 6. 7.
Вот собственно с википедии страницы ZK-фреймворк и указывается что это событийный-компонентный фреймворк. автор... создавать полноценные пользовательские интерфейсы для веб-приложений без применения JavaScript, в событийно-ориентированной парадигме и компонентной модели ... Т.е. нужно напрямую манипулировать компонентами интерфейса, изменения интерфейса императивны , в то время как в в реакте, и реактивных фреймворках изменения компонентов интерфейса производятся декларативно , за счет умного алгоритма фреймворка. В предыдущих постах вы привели 2 вещи, каждая из которых содержит только 1 част из 2х: - (присутствует клиент) react-подобный клиентский фреймворк, где пишешь на котлине и потом все это генерируется в JS, они реактивные, но там есть сложности с распредленной системой, там есть разделение на браузер и сервер. - (отсутствует реактивность) ZK-фреймворк - все делается на сервере, клиента нет, но нет реактивности. Мне нужно чтобы было и то и другое (как например в Elixir Phoenix LiveView) :). ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 17:48 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
То что есть палитра готовых компонентов в ZK и Oracle ADF - это безусловно хорошая вешь, большое улучшение по сравнению с чистым HTML и JS, с ними работать гораздо легче, как десктопное приложение в Дельфи получается . Но реактивность - это другой уровень, это еще лучше. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 17:53 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
Реактивность работает точно также с такими-же палитрами готовых компонентов, там тоже не нужно писать базового HTML, примеры с HTML на риакте - просто чтобы просто было и понятно о чем реч. В реальности в react.js никто не пишет HTML, берется готовая или делается с нуля палитра компонентов - точно такая-же как oracle adf - и точно-также быстро из готовых блоков строится. Только оно еще ко всему прочему и реактивное. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 17:55 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
Короче, нужна реактивность на сервере. А не реактивность только на клиенте (с JS подобными клиентскими Kotlin фреймворками), или на сервере но только событийность, без реактивности (ZK, Oracle ADF). ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 18:01 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
private, Понятие реактивность на бэке не совпадает с этим же словом на фронте. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 18:04 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
К слову - React - это не веб-фреймворк, понятно что основная движуха идет в вебе, и 90% проектов это хтмл и жаваскрипт. Но вообще это абстрактный алгоритм обновления компонентного дерева в соответствии с заданной моделью. Он работает где угодно, начиная от веба и заканчивая swing, мобильными нативными деревьями компонентов и т.п. на любых языках и с любыми компонентами. Собственно то что отсутствует в ZK фреймворке - этот самый алгоритм - который автоматически обновляет компонентное дерево в соответствии с изменившейся моделью. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 18:09 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
реактивность точнее, фреймворк - react.js это реализация этой идеи и алгоритма для хтмл и жаваскрипта. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 18:11 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
Но вообще наверно прийдется умерить желания и поближе посмотреть на компонентные фреймворки ZK и Vaadin. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 18:16 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
Вообще в ZK и Vaadin уже есть 90% того что нужно, нет только самого алгоритма сравнения соответствия дерева интерфейса с моделью. Сам то он простой, но вот чтобы он эффективно работал нужна возможность быстрого сравнения обьектов. А это можно сделать только если они иммутабельные. Соотв такой алгоритм в ZK и Vaadin потребует использования иммутабельных структур данных в моделях. И у них видимо часть пользователей к этому не готова и не обрадуется, возможно поэтому и не делают. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 18:18 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
private, - react js это либа для рендеринга. Как шаблоны. Всё - реактивное программирование это стримы Как тебя торкнуло что ты смешал одно с другим? Понятно что в шаблонах нет состояния. Нет событий. Это хорошо? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 18:48 |
|
Java/Kotlin серверный React
|
|||
---|---|---|---|
#18+
Под спойлером, т.к. все это уже писал Выше Я не очень понимаю, чем ADF (JSF) не реактивные 1. Создаем Business Object VO_Users на таблицу Users 2. На Page кладем Table связываем с VO_Users Можно вообще код не писать. Нужен только автогенеренный BO, для Page вроде код вообще не обязателен (могу ошибаться). Если нужна реактивность: говорим VO_Users.executeQuery - данные появляются, меняем данные в VO_Users - данные меняются.... куда уж больше В общем, Ваш "классический способ написания" я вообще не понимаю. Вот пишу я сейчас на Oracle Forms ))), оно конечно не Java, но у меня ВООБЩЕ НЕТ "функций рендеринга". Делал приложения на Oracle ADF - аналогично. Методы рендеринга конечно есть... но это такие дебри и потроха фреймворка, что нормальные люди туда вообще не лезут. Классический способ написания UI как Swing и т.п. - это MVC где есть 2 типа функций рендеринга - 1) функция которая рендерит начальное состояние UI 2) множество функций обновления UI, которые по реакции на события и обновления модели обновляют UI Мне это напоминает приложение моих коллег на QT. Где на каждый change text-item'а в каждом text-item'е написано UPDATE table SET field = :value в Вашем описание очень похоже, только "наоборот" ))). Но, извините, это совершенно НЕ "классический способ написания UI" IMHO & AFAIK Если же говорить про определение Реактивное программирование из Вики, то нафига это через задний проход ташить в классический ООП язык типа Java. Понятно, что на скриптовом языке такие зависимости значительно проще, понятнее и логичнее описываются. В Java же это будет требовать 100500 абстракций одна поверх другой. абстракция Listener - реактивность по Java'вски. И что? удобно? сколько будет кода если ее в каждый объект пихать. В реальности в react.js никто не пишет HTML, берется готовая или делается с нуля палитра компонентов 1. Сомневаюсь. что готовые палитры компонентов запустятся на рекламируемом Вами server side react'е 2. делается с нуля - ну и где профит от "модно-молодежно"? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 18:49 |
|
|
start [/forum/topic.php?fid=59&msg=39986443&tid=2120721]: |
0ms |
get settings: |
11ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
35ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
465ms |
get tp. blocked users: |
1ms |
others: | 296ms |
total: | 819ms |
0 / 0 |