Загрузка модуля один раз, requirejs с примерами

Я уже задаю аналогичный вопрос: Requirejs, что это значит Requirejs загружает каждый модуль один раз
но в той теме никто не ответил на главный вопрос, т.к. я не так задал.

Итак, я приведу несколько простых примеров, чтобы показать, что я имею в виду:

Модуль counter.js

1:    define([], function() {
2:        console.log("Executing counter");
3:        var counter = 0;
4:   
5:        return {
6:            increment: function() { counter++; },
7:            get: function() { return counter; }
8:        };
9:    });

Модуль test1.js

1:    define(['counter'], function(counter) {
2:        console.log("Executing test1");
3:        counter.increment();
4:    });

Модуль test2.js

1:    define(['counter'], function(counter) {
2:        console.log("Executing test2");
3:        counter.increment();
4:    });

Main.js

1:    require(['test1', 'test2', 'counter'], function(test1, test2, counter) {
2:        console.log("Executing main");
3:        alert(counter.get());
4:    });

Таким образом, модуль main.js является точкой входа приложения, которое сначала загружает зависимости «test1», «test2» и «counter». (Порядок выполнения: Выполнение счетчика, Выполнение теста1, Выполнение теста2, Выполнение основного)

Итак, если я понимаю предложение «Requirejs загружает каждый модуль один раз», это означает (например, counter.js), что код со строки 1 по 9 будет выполняться ТОЛЬКО ОДИН РАЗ, помимо того факта, что test1, test2 и основной модуль имеют counter в их списке зависимостей? Если это так, то test1 "отвечает" за выполнение модуля счетчика? И если это так, то после выполнения counter в памяти будет ТОЛЬКО ОДИН объект, который будет вернулся со стойки? Когда счетчик загрузки test2 получит этот ОДИН объект? (другими словами, test2 не будет снова выполнять код ни из счетчика, ни из основного, они будут использовать существующий объект счетчика)? Итак, я создаю SINGLETON здесь?

В конце концов, все модули могут влиять на значение счетчика (в начале счетчик = 0) через закрытие функций (приращение, получение)? Замыкания будут активны, пока объект счетчика существует в памяти?


person Srle    schedule 29.09.2013    source источник


Ответы (1)


Я изменил ваш main.js для входа в консоль

require(['test1', 'test2', 'counter'], function(test1, test2, counter) {
        console.log("Executing main");
        console.log(counter.get());
});

Кроме того, у меня есть index.html

<!DOCTYPE html>
<html>
<head>
    <title>My Counter Demo</title>
    <link rel="stylesheet" type="text/css" href="css/main.css">
    <script data-main="scripts/main" src="scripts/require.js"></script>
</head>
<body>
    <h1>My Counter Demo</h1>
</body>
</html>

После загрузки index.html и последующего открытия веб-консоли у меня есть

[22:04:09.077] "Executing counter"
[22:04:09.077] "Executing test1"
[22:04:09.077] "Executing test2"
[22:04:09.077] "Executing main"
[22:04:09.078] 2 

Сообщения журнала

Чтобы было понятнее, что происходит предлагаю заменить сообщения лога

  • Executing counter -> Creating the counter AMD module
  • Executing test1 -> Incrementing the counter in module "test1"
  • Executing test2 -> Incrementing the counter in module "test2"
  • "Executing main" -> Retrieving the counter value in module "main"

Я получаю следующий результат в журнале консоли

[22:16:46.368] file:///C:/Users/User/Documents/requirejs-counter2/css/main.css
[22:16:46.368] file:///C:/Users/User/Documents/requirejs-counter2/scripts/require.js
[22:16:46.369] file:///C:/Users/User/Documents/requirejs-counter2/scripts/main.js
[22:16:46.588] file:///C:/Users/User/Documents/requirejs-counter2/scripts/test1.js
[22:16:46.589] file:///C:/Users/User/Documents/requirejs-counter2/scripts/test2.js
[22:16:46.590] file:///C:/Users/User/Documents/requirejs-counter2/scripts/counter.js
[22:16:46.381] "Creating the counter AMD module"
[22:16:46.381] "Incrementing the counter in module "test1""
[22:16:46.381] "Incrementing the counter in module "test2""
[22:16:46.381] "Retrieving the counter value in module "main""
[22:16:46.381] 2

Заключение

Модуль счетчика загружается только один раз, поэтому объект счетчика создается только один раз. Вы можете считать, что это Singleton.

person z--    schedule 29.09.2013