3

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

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

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

4

1 回答 1

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()
});
于 2013-10-12T09:27:17.763 回答