Шаблонизатор на основе node.js с хранилищем объектов в MySQL и постобработкой на webkit?
Здравствуйте.
Хочу попробовать реализовать шаблонизатор на основе базы данных. Практически, переизобрести Веб. Идея такова.
1. При запросе страницы /index, node.js отдает только head, из которого исполняется init.js (пользовательский скрипт на стороне клиента).
2. init.js запрашивает GET /index?init.
3. node.js проверяет наличие страницы в таблице page.
4. node.js запрашивает записи из таблицы node, где `node`.`page` FK `page`.`uri` = index, а `node`.`parent` = 'body'.
5. node.js что-то достает из базы данных и отдает объекты первого уровня вложения в в таком виде: [header: [class: ['header', 'object`]], main: [class: ['main'], role: 'main', id: 'main']]. Объект кэшируется в ОЗУ и в следующий раз просто возвращается объект node.js.
6. Запрос кешируется на стороне клиента и в следующий раз init.js запросит /index?init уже с заголовком If-Modified-Since.
7. init.js строит DOM из полученных объектов и запрашивает следующий уровень для каждого из. Например, GET /index?header.
8. node.js отдает каждый из блоков, как в пункте 5.
В чем смысл:
1. Сделать HTML более ООП.
2. Кэшировать страницу по элементам, стили по классам (запросы кэшируются, какие-то данные можно кэшировать в indexedDB).
3. Передавать блоки параллельно по одному постоянному подключению, используя HTTP/2.
4. Вместо интервальной проверки изменений в блоках на стороне клиента, посылать новые блоки из сервера используя HTTP/2.
5. Возможность просматривать страницу без подключения к Интернету.
И многое другое.
Вопросы:
1. Как лучше хранить DOM. Как лучше хранить шаблон-выборку из DOM элементов (планирую в indexedDB на стороне клиента)?
2. Будут ли поисковые системы индексировать такие страницы, загружаемые посредством AJAX?
3. Как хранить innerText, ведь посередине него может быть вставлен блок?
4. Дублировать ли блоки для каждой из страниц или сохранять только оригинальны?
5. Насколько для такой задачи подходит mySQL? Можно ли заменить на indexedDB с последующим кэшированием в объекты на стороне сервера?
6. Сможет ли node.js обрабатывать по скажем 100 000 запросов блоков от 1000 клиентов в секунду? Какая конфигурация сервера нужна?
7. Встает вопрос, как же хранить динамические значения. А что если, например, к node.js подключить webkit и полученный из базы блок сразу же вставлять в body. К блокам, в которые нужно вставить динамическое значение добавлять атрибут data-post-action. И отлавливать событие создание DOM блока с определенными data-post-action?
Хотите переизобрести веб?
1. Избавьтесь от DOM, замените его компонентами, как в Delphi и в .NET. Вообще, HTML и CSS это очень плохие технологии для приложений, которые отбросили нас на два десятилетия.
2. Избавьтесь от HTTP, перейдите к RPC, это удобно для клиент-серверных приложений с установлением соединения, где взаимодействие через: вызов удаленных процедур и трансляцию событий.
3. Избавьтесь от реляционных СУБД и храните объекты без декомпозиции, строя вокруг них индексы, для быстрого поиска в коллекциях.
Нужна обратная совместимость с популярными браузерами. Упомянутые мною технологии, в том числе, HTTP/2 поддерживается всеми актуальными браузерами и 60% от всех на рынке.
Вы бы не могли ответить на технические вопросы? Как это будет работать и выгодно ли вообще такое поведение - вопрос другой. Нужны тесты. Мой метод как раз и подразумевает отказ от HTML/CSS.
Артур Когут: вот список того что портит
1. При запросе страницы /index, node.js отдает только !head, из которого исполняется init.js (пользовательский скрипт на стороне клиента).
2. init.js запрашивает GET /index?init.
3. node.js проверяет наличие страницы в таблице page.
4. node.js запрашивает записи из таблицы node, где `node`.`page` FK `page`.`uri` = index, а `node`.`parent` = 'body'.
5. node.js что-то достает из базы данных и отдает объекты первого уровня вложения в в таком виде: [header: [class: ['header', 'object`]], main: [class: ['main'], role: 'main', id: 'main']]. Объект кэшируется в ОЗУ и в следующий раз просто возвращается объект node.js.
6. Запрос кешируется на стороне клиента и в следующий раз init.js запросит /index?init уже с заголовком If-Modified-Since.
7. init.js строит DOM из полученных объектов и запрашивает следующий уровень для каждого из. Например, GET /index?header.
8. node.js отдает каждый из блоков, как в пункте 5.
Нагрузка на ваш сервер большая. Нагрузка на клиент тоже выше. Если вы не можете настроить кеш по нормальному то зачем городить такую штуку? P.S хранение шаблонов в базе линейкой по пальцам :D