У меня напрашивается определённые мысли по решению проблемы.
Спишу поделится.
Заранее извеняюсь за оффтоп. Разжовываю подробно и со всех сторон.
Который раз пишу про архитектуру, и всегда получается очень много . Словами большой кусок кода описать непросто
Итак напомню проблемы.
1)При возвращении данных в формате ajax у нас возникает проблема с поисковиками,
2)возвращая данные в html, мы обрекаем скрипт клиента работать с хтмл, что ему не всегда удобно
первую проблему можно решать делая рендер для сервера и клиента отдельно , что весьма трудозатратно.
Однако я сразу необратил внимание на то, что трудозатратно это только в том случае если на сервере и на клиенте разные языки,
к примеру PHP + JS.
Но ведь связки NODEJS+JS это не касается, тут то один язык !
================================================== =
Это значит что мы можем написать универсальный код который будет работать и на клиенте и на сервере.
Звучит неплохо, можно порассуждать как сделать.
================================================== =
Для начала назовём этот самый динамический фрагмент страницы виджетом, чтобы обзавестись терминологией.
Первое что приходит на ум, сделать виджет большим цельным модулем, который будет подключатся к клиенту и серверу.
Однако в этом случае на сервере будут подключаться обработчики событий браузера, которые там нафик не нужны, так как
серверной стороне пофиг на события браузера. Да и вообще виджет может быть очень очень большим, и пихать всё в один модуль не айс.
Попробуем разбить виджет на части, чтобы подключать в разных ситуациях только нужные части. За принципам разбивания далеко ходить не будем, возьмём проверенный MVC.
Тогда получается следующая картина.
Каждый виджет состоит из трёх частей.
Модель - хранит данные и умеет с ними оперировать.
VIEW - умеет рендерить данные в хтмл.
Контролёр - поведение виджета (реакция на события).
К серверу подключать достаточно VIEW и MODEL
К клиенту VIEW,MODEL и контролёр.
То есть на сервере при рендеренге страницы,мы используем VIEW которая использует модель.
На клиенте используется тот же view с той же моделью, и контролёр в придачу (чтобы он мог реагировать на события).
То есть в виджите есть две части(модель и view ), существующие одновременно на двух физических разделённых слоях системы.
================================================== =
Как добится их применимости на клиенте и на сервере одновременно ?
================================================== =
Очевидно что нужно абстракироваться от платформы.
Модель может отдалится от источника данных при помощи специального класс (назовём его PROXY).
Иными словами модель не будет иметь доступа к источнику данных напрямую. Она будет работать при помощи посредника, который скрывает от неё истинный источник данных.
Если прокси на сервере, будет посредником между бд и моделью,то на клиенте прокси будет посредником между моделью и сервером.
последний случай интересен тем, что в реальности прокси между моделью и сервером, это прокси между моделью и сервисом
сервера по предоставлению данных. В этом случае на сервис придётся возложить ответственность по проверке прав доступа
к данным, для каждой операции.
Представление (view) может отдалится при помощи шаблонизатора и какихнибудь хелперов для рендеринга.
Тоесть опять же особенности платформ мы пытаемся вынести в сторонние библиотеки, оставляя код виджета чистым
от тонкостей платформ.
================================================== =
как это приблизительно работает ?
================================================== =
Сервер
1) Генерируется страница, на странице обнаружен виджет
2) Подгружается модель и view виджета, в VIEW запускается метод rendeIndex, который рендерит виджет
3) VIEW в процессе рендеринга использует в качествке источника данных модель, модель для загрузки данных в себя,
обращается за помощью к прокси, который умеет работать с бд
4) Полностью отрендеренная страница отправляется клиенту.
клиент.
1) На страницу подгружаются все востребованные клиентом скрипты.(впрочем это может происходить паралельно с шагом 2)
2) Начинается процесс инициализации, сначало ищется тег в котором находится виджет, затем инициализируется
соответственный контроллёр, которому в качестве параметра передаётся ссылка на DOM элемент с виджетом.
3) контролёр, при инициализации может захотеть заполнить модель, в этом случает он даёт модели команду load,
модель обращается к прокси, который обращается к сервису на сервере, на сервере происходит проверка прав на доступ,
и если всё нормально то данные возвращаются прокси, и он заполняет данными модель.
4) дальше контролёр подписывается на все интерисующие его события.
5) Контролёр ждёт событий. Первый раз рендерить виджет не надо, так как он уже отрендерен на сервере.
Когда произойдёт события контролёр просто вызовет соответствующий метод у view для того чтобы он отобразил данные из модели.
================================================== =
Какой профит ?
================================================== =
1) Решили проблему с поисковиками. - Виджеты рендерятся на сервере, когда генерируется страница.
2) Сокращён срок разработки - Мы не дублируем код на сервере и на клиенте.
3) Сохранена функциональность клиентских скриптов, нет обязаловки в передачи клиенту HTML, клиент получает данные в формате JSON, которые попадают в модель, клиент этими данными распоряжается по своему усмотрению.
4) Мы получили возможность создавать очень сложные виджеты, за счёт разделение кода виджета на логические части.
================================================== =
Можно ли для построения сайта использовать только плагины ?
================================================== =
Кто работал с MODX тот в курсе что страницы там по сути статичный HTML, а весь динамически сгенерированный контент создают снипеты. Подобный подход можно применить и здесь, возвращать только статичный html с сервера, а весь динамически создаваемый контент в нём, могут создавать плагины. То есть страница будет просто рамкой в которую встроены плагины. Конечно всё вешать на плагины не обязательно, но идея на мой взгляд забавная.
Ниже я ещё допишу пару топиков с поянениями, и примерами кода.
Также жду ваших соображений по выше написанному.