1

有没有办法做类似以下的事情

shim: {
        bsAlert || bsTooltip || dbDropdown: {
            deps: ['jquery']
        }
    }

而不是跟随

shim: {
        bsAlert: {
            deps: ['jquery']
        },
        bsTooltip: {
            deps: ['jquery']
        },
        bsDropdown: {
            deps: ['jquery']
        }
    }

我的垫片列表太长了;有什么办法,我可以在哪里使用逻辑运算符或正则表达式来优化我的 shim 配置?

4

2 回答 2

2

您可能已经知道这一点,但||用于此目的在纯 JavaScript 中是行不通的。我不知道允许您提出什么建议的 JavaScript“扩展”语言(如 CoffeeScript)。

但是,你传递给 requirejs 的配置对象是可以动态构造的。因此,您可以执行以下操作:

var config = {
    baseURL: "lib",
    paths: { ... },
    shim: {
       moduleA: { ... }
    }
};

var s = config.shim;
s.bsAlert = s.bsTooltip = s.bsDropdown = { deps: ['jquery'] };

require.config(config);

如果您需要经常执行此操作,则可以编写如下配置:

var config = {
    baseURL: "lib",
    paths: { ... },
    shim: {
       moduleA: { ... }
      "bsAlert || bsTooltip || bsDropdown": { deps: ['jquery'] },
    }
};

然后让一个函数遍历配置对象,将“A || B”形式的键转换为requirejs想要的,然后再将对象传递给requirejs。而且由于 requirejs 在您多次配置时会结合配置,因此您可能会遇到以下情况:

require.config({
  // ... minimal config allowing to find "convert_config"
});

var convert_config = require("convert_config"); // module returns function

var config = {
    baseURL: "lib",
    paths: { ... },
    shim: {
       moduleA: { ... },
      "bsAlert || bsTooltip || bsDropdown": { deps: ['jquery'] },
    }
};

convert_config(config); // modifies object in-place

require.config(config); // pass the full configuration to requirejs
于 2013-10-31T10:34:15.210 回答
1

添加到@Louis-Dominique Dubeau 的答案。convert config 的定义如下。

define("convert_config", function(){
    function convert_config(config){
        for(var index in config.shim){
            if(index.indexOf("||")!=-1){
                var keys = index.split("||");
                for(var i=0; i<keys.length; i++){
                    config.shim[keys[i]] = config.shim[index];
                }
                delete config.shim[index]
            }
        }
        return config;
    }
    return convert_config;
})

var convert_config = require("convert_config");
var config = {
    baseURL: "lib",
    paths: {},
    shim: {
       moduleA: {},
      "bsAlert || bsTooltip || bsDropdown": { deps: ['jquery'] },
    }
};
config = convert_config(config);

require.config(config); 
于 2013-10-31T11:03:06.157 回答