Fork me on GitHub

Загрузчик (main.js)

Загрузка клиентской части приложения начинается с загрузки файла public/js/main.js. Файл public/js/main.js является точкой входа для библиотеки RequireJS public/js/requirejs/require.js,

Пример кода приведен ниже:

<!DOCTYPE html>
<html>
<head>
    ...
    <!-- Require -->
    <script type="text/javascript" data-main="/js/main" src="/js/lib/requirejs/require.js"></script>
    ...
</head>
<body>
    ...
</body>
</html>

RequireJS – если не самый популярный, то один из самых популярных файловых/модульных загрузчиков. При создании крупных компонентных проектов без него (или его аналогов) не обойтись, т.к. он решает основные проблемы таких приложений:

  • зависимости между модулями
  • засорение глобальной области

Зависимости между модулями

Настройка зависимостей между модулями осуществляется в файле public/js/main.js.

Пример кода таких зависимостей можно привести здесь:

(function ($) {
    ...
    requirejs.config({
        baseUrl: "/js",
        paths: {
            ...
            bootstrap: 'lib/bootstrap/bootstrap.min',
            respond: 'lib/bootstrap/respond.min', // bootstrap for old vers
            html5shiv: 'lib/bootstrap/html5shiv.min', // bootstrap for old vers
            jquery: 'lib/jquery/jquery.min',
            underscore: 'lib/underscore/underscore-min',
            storage: 'lib/jstorage/jstorage',
            backbone: 'lib/backbone/backbone-min',
            ExtendClass: 'lib/Extend.class',
            ...
        },
        shim: {
            'jquery': {
                exports: '$'
            },
            'bootstrap': {
                deps: ['jquery', 'respond', 'html5shiv']
            },
            'underscore': {
                exports: '_'
            },
            'backbone': {
                deps: ['underscore', 'jquery'],
                exports: 'Backbone'
            },
            'app/app': {
                deps: ['ExtendClass', 'bootstrap', 'underscore', 'storage']
            },
            ...
        }
    });
})(jQuery)

Класс App

В файле public/js/main.js мы также создаем объект класса App public/js/app/app.js.

...
require(['app/app'], function (App) {
    window.app = new App();
});

В классе App создается объект локализации класса Land public/js/app/land.js и объект общих системных функций класса System public/js/app/system.js. А также создаются и регистрируются объекты с их параметрами на основе сервисных классов, заданных для текущей страницы сайта приложения.

...
// Create System object
this.sys = new System();
// Create Lang(language) object
this.lb = new Lang(this.sys);

// Add script resources 
if (undefined !== window.BSA) {
    _.each(BSA.ScriptResources, function (resource) {
        require([resource], function (res) {
            // Create resource object 
            if (res && res.RegRunOnLoad) {
                res.RegRunOnLoad();
            }
        });
    });
}
...