Русская Википедия:Pusa WEB
Pusa WEB без JS — концепция для создания клиент-серверных Web приложений, без необходимости разработки на JavaScript для Frontend в любом виде. Управление браузером и управление DOM элементами выполняется на Backend согласно архитектурного стиля REST c MVC. Непосредственная работа с DOM выполняется Frontend на основе директив Backend. Концепция и PHP фреймворк опубликованы под лицензией aGPL.v3.
Базовые принципы
Pusa реализует следующие принципы:
- Обработка событий DOM выполняется на стороне сервера (Backend) по запросу клиента (Frontend).
- Backend формирует инструкции для Frontend, основываясь исключительно на условиях запроса.
- Спецификация инструкций ограничена протоколом и не требует изменения под прикладную задачу.
- Серверная сторона не проверяет результат исполнения инструкций.
Основа работы с DOM
Frontend на основании команд Backend формирует список фокусных DOM элементов. Все действия с DOM, включая изменение контента, создание удаление элементов, модификация стилей производятся только над фокусными элементами. Таким образом на Backend переносится управление, а фактическая работа остается на Front. Подход позволяет исключить JS разработку, при этом не требуется хранение состояния сессии на Backend.
Цикл взаимодействия Front-Back
При загрузке страницы браузер загружает базовый DOM content и JS ядро Pusa.
Frontend направляет события браузера (как то click, blur, focus, keypress, mousemove), атрибуты и свойства событийного элемента, URL текущей страницы, а так же GET и POST параметры на Backend.
На основании полученных данных Pusa-Back определяет контроллер, выполняет полезную нагрузку и формирует ответный набор команд.
Получив ответ запроса Pusa-Front выполняет команды, изменяя контент DOM и производя визуальные эффекты.
Достоинства
Pusa исключает необходимость JS разработки для Frontend, а следовательно не требуется согласования API вызовов между Backend и Frontend. Отсутствие JS разрешает проблему сериализации REST, исключая необходимость средств типа gRPC и тд. Компоненты MVC ограничены Backend и не распространяются на Frontend.
Клиентское JS приложение в браузере компактно (6кб production) и стабильно. Концептуально повышается безопасность, так как код приложения Backend не доступен извне.
Направление событий на сервер представляет для SEO весь объем действий пользователя для анализа.
Для пользователя сокращается время загрузки страниц. Время открытия первой страницы минимально.
Особенности
Pusa переносит часть нагрузки с Frontend на Backend и увеличивает частоту обмена с сервером. Частота обращения компенсируется сокращением нагрузки от исполнения каждого запроса за счет внутренней архитектуры Pusa. Backend не выполняет "тяжелую" работу с DOM, а формирует исключительно инструкции для Frontend.
Pusa не использует JS код вне базового фреймворка, но требует включенного JS на стороне браузера для реализации функционала.
Ограничения
Интерактивные приложения на базе сanvas и оnmousemove формируют значительный поток событий. Pusa имеет механизмы буферизации вызовов и замыканий, позволяющие обрабатывать множественные события, например, mousemove без повышения нагрузки на сервер. Однако, при необходимости обработки каждого события с выполнением логики Pusa не является оптимальным решением. Пример: код JS потребуется при разработке ядра онлайн графических редакторов.
В случае, если прикладная задача требует использования сторонних JS скриптов, они должны быть загружены в браузер. Pusa предусматривает механизм использования внешних скриптов JS.
PHP Реализация
На момент публикации Pusa реализована на PHP 7.2. Основным транспортом является AJAX через XMLHttpRequest. Исходный код представлен на gitlab. Полнофункциональный контейнер доступен через Docker в составе Ubuntu, PHP, Nginx. Основная цель реализации — демонстрация концепции Pusa наиболее простыми средствами.
Реализация включает:
- Создание и поддержка множества веб проектов на одном узле;
- Межпроектное наследование исходного кода и контента;
- Мультиязыковая поддержка текстового и графического контента;
- Возможность реализации пользовательских контроллеров в парадигме MVC;
- Демонстрационные примеры;
- Возможности взаимодействия с буфером обмена, мультимедийными объектами, адресной строкой, консолью браузера, css и прочим;
- CLI интерфейс.
Директивы Pusa формируют линейную структуру за счет использования цепных вызов методов. Циклы и условия в большинстве случаев не требуются.
public function Init()
{
return $this
-> Debug( TPusaCore::DEBUG_ON )
-> Event( 'Main', 'Popstate', 'popstate', TPusaCore::TARGET_WINDOW )
-> FocusBody()
-> DOMTemplate( 'Main.html')
-> FocusChildren( 'Menu' )
-> FocusChildren( 'Action')
-> Event( 'Main', 'Item' )
-> Popstate();
}
Код Pusa для управления DOM лаконичнее аналогичного функционала для ванильного JS.
/* Pusa PHP */
$this->FocusBody()->FocusChildren('MyClass')->DOMContent('Content');
/* JavaScript */
let l=document.getElementsByClassName('MyClass');for(let i=0;i<l.length;i++){l.innerHHTML='Сontent'};
История
Базовые серверные библиотеки начали формироваться в 2004 году при работе над серией холдинговых проектов, использующих линейку продуктов Microsoft. В последующем они были объединены в моноядро Catlair на базе MSSQL, в котором присутствовали как Backend так и Frontend. Поддержка кодовой базы на продукции Microsoft стала невозможна в 2014 году. Последовала миграция проекта на Linux c использованием MySQL в базовом варианте. Используемые программные средства и координация отдельных задач между Backend и Frontend потребовали сокращения.
Последовательная редукция средств разработки и опыт работы с низкоуровневым оборудованием привели в 2019 году к созданию концепции Pusa. В основу легло восприятие браузера, как аппаратного черного ящика без возможности обратного взаимодействия. Это позволило реализовать директивный принцип передачи команд в ответе на запрос. Необходимость оптимизации инфраструктуры определила развитие Pusa на минимально доступном оборудовании. Производительность достигается за счёт масштабирования.
С февраля 2021 по ноябрь 2021 года код Pusa был выделен в отдельный проект и 06.11.2021 опубликован под лицензией aGPL.v3.
В январе 2022 опубликованы интерфейсы CRUD для MySQL, MsSQL, PostgreeSQL.
Планы
Дальнейшая разработка будет направлена на создание Enterprize версии с протоколом Pusa поверх WebSocket без отказа от AJAX, выделение CRUD API для Postgress, MSSQL, а так же реализация Pusa на языках в порядке очередности:
Последующий план — реализация платформы разработки мобильных приложений с использованием протокола Pusa путем внесения его в API браузера. Указанная цель позволит в полной мере реализовать базовую концепцию Web без JS.
Ссылки
- Сайт Pusa
- Исходный код на gitlab (англ)
- Документация
- Демонстрационный Docker контейнер Ubuntu Nginx PHP Pusa
- Публикация и обсуждение на OpenNet
- Сравнение концепции Pusa аналогичным по целям решением Korolev (обсуждение)
- Информация о публикации Pusa (англ)
- Демонстрационный файлообменник
- Пример интерактивной английской грамматики
- Демонстрация CRUD
- Русская Википедия
- Страницы с неработающими файловыми ссылками
- Свободные библиотеки программ
- Свободное кроссплатформенное программное обеспечение
- Программное обеспечение с лицензией GNU AGPL
- Веб-фреймворки на PHP
- Фреймворки
- Шаблоны проектирования
- Страницы, где используется шаблон "Навигационная таблица/Телепорт"
- Страницы с телепортом
- Википедия
- Статья из Википедии
- Статья из Русской Википедии