requirejs 如何根据文件名为每个具有属性的定义提供一个新的 "class" 实例?

How can requirejs provide a new "class" instance for each define with properties based on the filename?

用例正在实施调解器模式,其中每个实例都是一个 postal.js 通道。

用实际代码解释它需要一些postal.js知识,所以我下面的例子在概念上是相似的,但只使用了requirejs。

// animalSounds.js
define([],function(){
  return {
    cat:'meow',
    dog:'woof'
  };
});

// animalFactory.js ... the requirejs plugin
define(['animalSounds'],function(animalSounds){
  function animalClass(name){
    this.sound = animalSounds[name];
  }
  return {
    load:function(name, req, onload, config){
      onload(new animalClass(name)); 
    }
  }
});

// cat.js
define(['animalFactory'],function(animalInstance){
  animalInstance.sound === 'meow'; // should be true
});

// dog.js
define(['animalFactory'],function(animalInstance){
  animalInstance.sound === 'woof'; // should be true
});

基本上它是一个工厂,在需要时 returns 一个新的实例。那部分我可以很好地创造。我正在努力解决的问题是根据需要它的模块从其他来源获取动态属性。虽然我可以在每个文件中将密钥定义为字符串,但我希望使用文件名作为密钥来保持 DRY。

我会尽量不违反 DRY 原则,例如 cat,像这样:

define(['animalFactory!cat'],function(animalInstance){
  animalInstance.sound === 'meow'; // should be true
});

事实是,虽然 可能 使用加载器做你想做的事,但生成的代码会很复杂,并且会模糊你的应用程序的逻辑.例如,多次要求 animalFactory 并期望不同的结果(这是您在问题中遇到的结果)违反了 RequireJS 的基本原则之一:一遍又一遍地要求相同的模块名称应该 return一遍又一遍地使用相同的值。

请注意,可能需要 module 模块(它是一个特殊模块),然后使用 module.id 来知道您所在模块的名称,但不幸的是,这不是可用于在 define.

上构建依赖项列表