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

RequireJS load same module twice to get two separate namespaces

本文关键字:命名空间 两个 单独 两次 同一个 加载 模块 RequireJS      更新时间:2023-09-26

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

库.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()

这是与上面相同的示例程序,但适用于浏览器

索引.html

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

命令行.js

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

两个程序都将输出:

控制台日志

222
222

但所需的输出是

控制台日志

111
222

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

为什么不在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()
});