palkan_tula
palkan
Эволюция фронтенда
Приводит к разделению разработчиков
на бекенд и фронтенд «группировки»
Вытесняет Ruby/Rails на роль
поставщика API
Увеличивает стоимость разработки и
поддержки*
18
* Примечание: мнение автора может не совпадать, а может и совпадать
Slide 19
Slide 19 text
palkan_tula
palkan
19
Возможна ли разработка
современных веб-приложений,
не выходя из зоны комфорта
Ruby и Rails
palkan_tula
palkan
Turbolinks
SPA для бедных HTML приложений
Перехватывает переходы по ссылкам,
запрашивает страницы асинхронно
(AJAX), заменяет HTML (только body)
Использует собственный кэш для
создания ощущения мгновенных
переходов
25
palkan_tula
palkan
Phoenix LiveView
HTML-компонент «присоединяется» к процессу
на сервере (через сокет)
Процесс реагирует на сообщения из браузера
или других процессов, вычисляет изменившиеся
части шаблона и отправляет их клиенту
Клиент использует morphdom для изменения
DOM
42
Slide 43
Slide 43 text
palkan_tula
palkan
“A new way to craft modern,
reactive web interfaces with
Ruby on Rails.”
43
Slide 44
Slide 44 text
palkan_tula
palkan
44
автор Stimulus Reflex
CableReady
Slide 45
Slide 45 text
palkan_tula
palkan
CableReady
Библиотека для изменения DOM с
сервера
Использует для транспорта Action
Cable broadcast
Использует morphdom на клиенте
45
Slide 46
Slide 46 text
palkan_tula
palkan
Пример
46
...
<%= button_to item_path(item),
method: :delete,
remote: true do %>
...
<% end %>
Slide 47
Slide 47 text
palkan_tula
palkan
Пример
47
# items_controller.rb
def destroy
item.destroy!
stream = ListChannel.broadcasting_for(item.list)
cable_ready[stream].remove(selector: dom_id(item))
head :no_content
end
Slide 48
Slide 48 text
palkan_tula
palkan
CableReady
48
Slide 49
Slide 49 text
palkan_tula
palkan
StimulusReflex
Рефлексы (объекты) реагируют на
действия пользователя и
рендерят HTML
CableReady отправляет HTML
клиенту и обновляет DOM
49
palkan_tula
palkan
Пример
53
class ListReflex < ApplicationReflex
def toggle_item_completion
item = find_item
item.toggle!(:completed)
html = render_partial("items/item", {item})
selector = dom_id(item)
cable_ready[
ListChannel.broadcasting_for(item.list)
].outer_html( **{selector, html})
cable_ready.broadcast
morph_flash :notice, "Item has been updated"
end
private
def find_item
Item.find element.dataset["item-id"]
end
end
Slide 54
Slide 54 text
palkan_tula
palkan
Пример
54
class ListReflex < ApplicationReflex
def toggle_item_completion
item = find_item
item.toggle!(:completed)
html = render_partial("items/item", {item})
selector = dom_id(item)
cable_ready[
ListChannel.broadcasting_for(item.list)
].outer_html( **{selector, html})
cable_ready.broadcast
morph_flash :notice, "Item has been updated"
end
private
def find_item
Item.find element.dataset["item-id"]
end
end
Изменяем DOM элемента всем
подключенным пользователям (и
себе)
Показываем flash-сообщение
текущему пользователю
Объект-представление текущего
элемента
Slide 55
Slide 55 text
palkan_tula
palkan
Пример
55
class ApplicationReflex < StimulusReflex ::Reflex
private
def morph_flash(type, message)
morph "#flash", render_partial(
"shared/alerts",
{flash: {type => message}}
)
end
end
Slide 56
Slide 56 text
palkan_tula
palkan
Больше рефлексии
futurism — асинхронная загрузка
элементов страницы
optimism — серверная валидация
форм в реальном времени
56
Slide 57
Slide 57 text
palkan_tula
palkan
И немного альтернативы
57
github.com/unabridged/motion
Slide 58
Slide 58 text
palkan_tula
palkan
SR: сильные стороны
Стабильный проект (v3.4)
Одна из лучших документаций в
мире OSS
Активное сообщество в сети
(Discord >700 участников,
многочисленные посты и видео)
58
palkan_tula
palkan
SR: слабые стороны
Action Cable
Большой объём данных по сети (нет
механизма диффов как в LiveView)
Данные всегда идут через pub/sub
(даже если нужно отправить клиенту-
инициатору)
61
AnyCable
Slide 62
Slide 62 text
palkan_tula
palkan
62
Весь наш UI — это просто HTML.
Как нам его организовать?
palkan_tula
palkan
Фронтенд без фронтенда
Способен заменить JS фреймворки/
SPA для приложений с
нехитровыдуманным UI
Повышает продуктивность (но всё же
имеет порог вхождения)
Новая эра только начинается, всё
лучшее — впереди!
88