6

我已经问过类似的问题: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:    });

主.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”。(执行顺序:执行counter,执行test1,执行test2,执行main)

因此,如果我理解句子“Requirejs 加载每个模块一次”,这意味着(例如 counter.js)从第 1 行到第 9 行的代码将只执行 一次,除了 test1、test2 和主模块在其依赖项列表中有计数器之外?如果这是正确的,test1 是“负责”执行计数器模块吗? 如果这是正确的,在执行计数器之后,内存中将只有一个从计数器返回的对象?当 test2 加载计数器时,它会得到那个 ONE 对象吗?(换句话说,test2 不会再次执行来自计数器的代码,它们将使用现有的计数器对象)? 那么,我在这里创建 SINGLETON 吗?

最后,所有模块都可以通过函数(增量,获取)闭包来影响计数器值(开始时,计数器 = 0)? 当内存中存在计数器对象时,闭包会存活吗?

4

1 回答 1

6

我将您更改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.

于 2013-09-29T22:21:40.150 回答