gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 00:08:37 24 4
gpt4 key购买 nike

这个示例库,它在浏览器下使用 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) }
}
})

现在这个库被 Node 示例程序使用

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 加载模块两次,或者换句话说有两个独立的命名空间?

最佳答案

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

关于javascript - RequireJS 两次加载同一个模块以获得两个独立的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19331752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com