RequireJS-加载模块的多个实例

RequireJS - Load multiple instances of module

本文关键字:实例 加载 模块 RequireJS-      更新时间:2023-09-26

我正试图在RequireJS中编写一个插件,每次调用它时都会创建一个对象的实例。

例如:

define("loader", {
  load: function(name, req, onload, config) {
    var instance = GlobalGetter.get(name);
    instance.id = new Date().getTime() * Math.random();
    onload(instance);
  }
});
require(["loader!goo"], function(instance) {
  console.log(instance.id); // 12345
});
require(["loader!goo"], function(instance) {
  console.log(instance.id); // 12345 SAME!
});

在这种情况下,"goo"只加载一次,因此两个require回调都传递给同一个对象实例。当你考虑到RequireJS试图解决的问题时,这是完全可以理解的,但这不是我所需要的。

是否可以将插件配置为从不返回缓存结果?除了这个用例之外,RequireJS完全符合我的需求。有什么(非)官方的方式来获得我想要的行为吗?

谢谢。

为了说明我的方法,您甚至不需要插件,只需要定义一个类似的构造函数

define( {
  'getInstance': function(){
    var instance = new Object(); // init the object you need here
    instance.id = 42; // some more dynamic id creation here
    return instance;
  }
} );

然后你的实际通话会是这样的:

require(["loader!goo"], function(constructor) {
  var instance = constructor.getInstance();
  console.log(instance.id);
});

所以我已经弄清楚了,但我肯定试图错误地使用RequireJS插件。

这个解决方案违背了插件的预期行为,所以你可能不应该这么做

define("loader", {
  load: function(name, req, onload, config) {
    // Strip out the randomizer
    name = name.substring(0, name.indexOf("?"));
    // Logic you want repeated each time
    var fn = Something.GetClass(name);
    var instance = new fn();
    instance.id = Math.random();
    onload(instance);
  },
  normalize: function(name, normalize) {
    return name + "?" + Math.random();
  }
});
require("loader!goo", function(instance) {
  console.log(instance.id); // 123
});
require("loader!goo", function(instance) {
  console.log(instance.id); // 456
});