通过require.js导出新对象时:它实际上是创建"新"对象还是仅返回现有实例

Gle*_*ift 2 javascript singleton module requirejs

假设我在require.js中有模块A,B和C. 模块A导出新对象.

define(function() {

    // constructor
    function F() {
        this.prop = 'some';
    }

    // module exports
    return new F();   

});
Run Code Online (Sandbox Code Playgroud)

模块B和C从A导入F()的实例:

define(['A'], function(f_inst) {
    // code
});
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我需要F成为单身人士.我还没有认真了解require.js的工作原理.所以,这是我的问题:在这种情况下,我是否需要为F()使用单例模式?

And*_*iov 5

AMD模块defined,只有一次.即使您需要多次,它也只会被评估一次.

你可以查看这个例子:

F.js

define(function() {

    // constructor
    function F() {
        this.prop = 'some';
    }

    // module exports
    console.log('evaluated!');
    return new F();   

});
Run Code Online (Sandbox Code Playgroud)

A.js

define(['./F'], function(F) {
    return 'A';
});
Run Code Online (Sandbox Code Playgroud)

B.js

define(['./F'], function(F) {
    return 'B';
});
Run Code Online (Sandbox Code Playgroud)

main.js

require(['./A', './B'], function(A, B) {
    console.log(A, B);
});
Run Code Online (Sandbox Code Playgroud)

的index.html

<!doctype html>
<html>
    <head>
    </head>
    <body>
        <script data-main="main" src="require.js"></script>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

"已评估"消息仅打印一次.