Upd 2018. Фреймворк на основе данной архитектуры https://github.com/artnv/hybrid
Пример одностраничного, расширяемого веб-приложения интернет магазина, со слабосвязанной архитектурой.
Из сторонних компонентов это Роутер и Диспетчер событий от Backbone. Для визуального оформления используется Bootstrap. Немного jQuery в представлениях и Pace.js в качестве автоматического индикатора загрузки. А серверная часть состоит из PHP и MySQL. Обмен данными по Ajax формата JSON.
Компоненты могут быть заменены на компоненты от других библиотек, архитектура позволяет это сделать безболезненно, просто подключив модуль и реализовать аналогичный интерфейс взаимодействия, так как все зависимости передаются через DI-контейнеры.
- Модульная, расширяемая MVC-архитектура построенная на объектах, с пространством имён, DI-контейнерами и системой Событий. Сама архитектура написана на чистом JavaScript (ES5)
- В приложении так же есть виджеты, компоненты, менеджеры модулей, система переключения шаблонов и многое другое
- Независимые друг от друга запросы (Не ждут результат ответа, на основе которого строят следующий запрос)
- Не жадная загрузка контента. Всё что видим на экране то и загружаем
- Кеширование всего что ранее было загружено. Страницы, товар и прочий статический и динамический контент
- Автообновление контента и настроек приложения. Если администратор добавил или удалил товар, то данные у пользователя автоматически обновляются, без перезагрузки страницы
- Следование принципу единственной ответственности, в модулях
- Так же используются паттерны проектирования
- Вес приложения (без картинок) с библиотеками, стилями, шрифтами ~100кб после gzip-сжатия на сервере Nginx
- Работает без лагов, на компе 2001 года с характеристиками: Windows Xp, Opera 9, Celeron 848Mhz, 128Mb Ram
Все модули реализованы через замыкание, имеют публичные и приватные свойства. Модули могут подключаться друг к другу, так как после загрузки они возвращают публичный объект. Эта особенность объектов используется в качестве пространства имен, которая позволяет не засорять глобальное пространство и при этом возникает возможность произвольно хранить файлы, в любых директориях и с разной вложенности, в рамках проекта. Модуль всегда подключиться туда, куда нужно, а инструмент Gulp, автоматически найдет все файлы, потом минифицирует и объединит их в один bundle.
В приложении используется система Событий для общения между модулями, которая позволяет удобно реагировать на асинхронные ajax-запросы и вдобавок жестко не привязывать модули друг к другу.
При переходе на url запрашивается контент, а потом отображается на странице