Модулът се зарежда веднъж, изисква js с примери

Вече задавам подобен въпрос: 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 и основният модул имат брояч в техния списък със зависимости? Ако това е правилно, test1 е "отговорен" за изпълнението на модула за брояч? И ако това е правилно, след изпълнение на брояча, в паметта ще има САМО ЕДИН обект, който ще бъде върнат от гишето? Когато test2 зареди брояча, той ще получи този ЕДИН обект? (с други думи test2 няма да изпълни отново код от counter нито main, те ще използват съществуващ counter object)? И така, създавам ли 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="/bgcss/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