«Фреймворк» построенный на принципе MVC (HMVC) с учётом особенностей языка.
- Блекджек и блудницы
 - Единая точка входа
 - Система роутинга
 
- jQuery
 - jQuery.Class (из JavaScriptMVC)
 - History.js
 - Require.js
 
inital release
- Система роутинга (App.Route);
 
- Pub\Sub интерфейс (App.sub(), App.pub(), App.unsub());
 - Рефакторинг (поведение App как модуля, JsLint);
 
- App.Router bugfixes
 - App.Router GET parameters workaround (App.Router.getParams():object, App.Router.getParamsString():string)
 
- App.js рефакторинг, смена схемы роутинга (модуль-правила на класс-правила);
 
- Все части App теперь объединены нейспейсом (и одноимённой папкой) app.
 - App теперь реализует паттерн синглтон. (См. пример ниже).
 - И зависит от Underscore.js.
 - App.Route.js переименован в app/Router.js (класс app.Router).
 - Pubsub (методы App.sub, App.unsub и App.pub) вынесен из App.js в app/Hub.js (класс app.Hub). Сигнатуры и реализация методов не изменились.
 - App.dmesg переименован в Logger.log и, соответственно, перенесён в app/Logger.js (класс app.Logger).
 - Добавлен app.Comet
 - Добавлен интерфейс для модулей app.IModule
 - Добавлен абстрактный класс app.ADeferredModule
 - Добавлен app.App.when()
 - Изменились правила преобразования имени модуля в имя соответствующего файла (метод app.App._getModuleNameByClass()). Было: Filehost.Module.Gallery -> filehost/module/gallery.js Стало: filehost.module.Gallery -> filehost/module/Gallery.js
 - У App-а появилось состояние готовности. Выключается при выполнении метода run(). Включается по факту готовности всех модулей. Модули бывают двух типов — обычные (реализующие интерфейс app.IModule) и «отложенные» (наследующие абстрактный класс app.ADeferredModule). App считает обычный модуль готовым, как только его метод run() возвращает управление. «Отложенные» модули должны сами сообщить о своей готовности: app.Hub.pub("app/module/ready", this.constructor.fullName);
 
- Убрал зависимость от Underscore.js
 
- Убита, наконец, зависимость от jQuery.whenReady!
 - Новый механизм App.ask/App.answer
 - Logger.error -> throw new Error() (Logger.error можно позвать из try-catch в, например, main.js)
 
Статические методы
- when()
 - ask()
 - answer()
 
Методы прототипа
- init()
 - run()
 - cleanup()
 
Описание
Ядро.
Следит за изменениями location и запускает модули-контроллеры в соответствии с заданными правилами роутинга.
Статические методы
Методы прототипа
Описание
Роутер.
блаблабла
Статические методы
- pub()
 - sub()
 - unsub()
 
Методы прототипа
Отсутствуют.
Описание
Pubsub Hub.
блаблабла
Статические методы
- log()
 
Методы прототипа
Отсутствуют.
Описание
Обёртка вокруг console.log.
Статические методы
- send()
 
Методы прототипа
- init()
 
Описание
Реализует (пока) только long-polling. Реализован (пока) как синглтон.
<script data-main="/js/main" src="/js/require.js"></script>Пример содержимого:
require(["app/App"], function(App) {
    // Правила для роутера вида (Класс (контроллер): массив правил). Правила могут быть строкой или регулярным выражением.
    var moduleRoutes = {
        "app.module.Common":        [/.*/],
        "app.module.CategoryList":  ["product/category/list"],
        "app.module.CategoryEdit":  ["product/category/edit"]
    };
    // Инициализация ядра приложения
    var app = new App.getInstance({
        routes: moduleRoutes,
        baseNamespace: "App"
    });
    
    // Первый запуск (последующие сработают автоматически при смене url)
    app.run();
});PUB/SUB