此示例库,在浏览器下使用RequireJS并在Node.js下使用amdefine:
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) }
}
})
现在这个库由节点示例程序
使用var lib=require('./lib')
lib.set(111)
var lib2=require('./lib')
lib2.set(222)
lib.show()
lib2.show()
这是与上面相同的示例程序,但对于浏览器而言
<script data-main="cli.js" src="require.js"></script>
requirejs(['lib','lib'], function(lib, lib2) {
lib.set(111)
lib2.set(222)
lib.show()
lib2.show()
});
两个程序都会输出:
222
222
但期望的输出是
111
222
这是因为实际模块只加载一次,有没有办法告诉RequireJS加载模块两次,换句话说有两个独立的命名空间?
答案 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()
});