RequireJS加载相同的模块两次以获得两个单独的命名空间

时间:2013-10-12 07:38:03

标签: javascript node.js requirejs

此示例库,在浏览器下使用RequireJS并在Node.js下使用amdefine:

lib.js

if (typeof define !== 'function') { var define = require('amdefine')(module); }
define([],function () {
    var opt = 0
    return {
        set: function(x) { opt = x },
        show: function() { console.log(opt) }
    }
})

现在这个库由节点示例程序

使用

srv.js

var lib=require('./lib')
lib.set(111)
var lib2=require('./lib')
lib2.set(222)
lib.show()
lib2.show()

这是与上面相同的示例程序,但对于浏览器而言

的index.html

<script data-main="cli.js" src="require.js"></script>

cli.js

requirejs(['lib','lib'], function(lib, lib2) {
    lib.set(111)
    lib2.set(222)
    lib.show()
    lib2.show()
});

两个程序都会输出:

控制台日志

222
222

但期望的输出是

控制台日志

111
222

这是因为实际模块只加载一次,有没有办法告诉RequireJS加载模块两次,换句话说有两个独立的命名空间?

1 个答案:

答案 0 :(得分:0)

为什么不在lib(http://jsfiddle.net/cFEeR/1/)中创建命名空间:

if (typeof define !== 'function') { var define = require('amdefine')(module); }
define('lib',function () {
    var namespaces = {}
    var Namespace = function() {
        this.opt = 0
    }

    Namespace.prototype.set = function(x) { this.opt = x },
    Namespace.prototype.show = function() { console.log(this.opt) }

    return function(name) {
        if (!namespaces[name]) namespaces[name] = new Namespace()
        return namespaces[name]
    }
})

requirejs(['lib'], function(Lib) {
    var lib = Lib('test')
    var lib2 = Lib('test1')
    lib.set(111)
    lib2.set(222)
    lib.show()
    lib2.show()
});