0

反正有没有自动化这个,真的多余。

define("simba", ['meta',"slider", "quickview", "share", "mylife"], function(meta, slider, quickview, share, mylife){
    var simba = {
        meta: meta,
        slider: slider,
        quickview: quickview,
        share: share,
        mylife: mylife
    };
    return simba
});
4

2 回答 2

1

只是一个想法,但您可以创建一个autoDefine函数,该函数将生成一个新函数,然后生成所需的对象。

演示: http ://plnkr.co/edit/zLfGkxj21S7B2SaQmMhO?p=preview

第一种方法用于new Function避免在autoDefine函数范围上创建闭包,以确保namedependencies变量被垃圾收集。但是,此方法较慢,因为它必须进行一些字符串操作。

autoDefine("simba", ['meta',"slider", "quickview", "share", "mylife"]);

function autoDefine(name, dependencies) {
    var json = dependencies.join(',').replace(/([^,]+),?/g, '"$1":$1,').replace(/,$/, '');
    define(name, dependencies, new Function(dependencies, 'return eval("({"+\'' + json + '\'+"})");'));
}

这是另一种利用闭包的方法,但是如果RequireJS在执行后不释放工厂函数,则依赖项数组将保留在内存中。

function autoDefine2(name, dependencies) {
    define(name, dependencies, function () {
        var i = 0,
            len = arguments.length,
            o = {};

        for (; i < len; i++) {
            o[dependencies[i]] = arguments[i];
        }

        return o;
    });
}

以下是性能测试,表明其autoDefine2性能优于autoDefine.

于 2013-04-25T21:17:00.827 回答
1

这也许?

(function (deps) {
define("simba", deps, function () {
    var simba = {};
    for (var i = deps.length-1; i >= 0; i--) {
        simba[deps[i]] = arguments[i];
    }
    return simba;
});
}(['meta', "slider", "quickview", "share", "mylife"]));

虽然可能会打败 RequireJS 优化器,所以不确定它的好处。

于 2013-04-25T21:17:57.447 回答