加载模块一次,需要带有示例

Srl*_*rle 6 javascript 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:    });
Run Code Online (Sandbox Code Playgroud)

模块test1.js

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

模块test2.js

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

Main.js

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

所以模块main.js是应用程序的入口点,它将首先加载依赖项"test1","test2"和"counter".(执行顺序:执行计数器,执行test1,执行test2,执行main)

所以,如果我没有理解句子"Requirejs负载的每一个模块的一次",这意味着(例如counter.js的)从行1到9的代码会被执行 ONLY ONCE事实为test1,test2的和主要模块有柜台在它们的依赖列表旁边?如果这是正确的,test1是"负责"执行计数器模块? 如果这是正确的,在执行计数器后,在内存中只有一个对象将从计数器返回?当test2加载计数器时,它将获得那个ONE对象?(换句话说,test2不会再次执行来自计数器的代码,它们将使用现有的计数器对象)? 那么,我在这里创建SINGLETON吗?

最后,所有模块都可以通过函数(递增,获取)闭包影响计数器值(在开头,counter = 0)? 当计数器对象存在于内存中时,闭包将处于活动状态?

z--*_*z-- 6

我改变你main.js的登录到控制台

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

另外我有一个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>
Run Code Online (Sandbox Code Playgroud)

加载index.html后再打开Web控制台

[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 
Run Code Online (Sandbox Code Playgroud)

记录消息

为了更清楚地说明发生了什么,我建议替换日志消息

  • 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
Run Code Online (Sandbox Code Playgroud)

结论

计数器模块仅加载一次,因此仅创建一次计数器对象.你可以认为它是一个Singleton.