无论如何都要实现自动化,真的是多余的。
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
});
答案 0 :(得分:1)
只是一个想法,但你可以创建一个autoDefine
函数,它将生成一个新函数,然后生成所需的对象。
DEMO: http://plnkr.co/edit/zLfGkxj21S7B2SaQmMhO?p=preview
第一种方法使用new Function
来避免在autoDefine
函数范围内创建闭包,以确保name
和dependencies
变量得到垃圾回收。但是,这种方法较慢,因为它必须进行一些字符串操作。
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;
});
}
以下performance tests表明autoDefine2
的效果优于autoDefine
。
答案 1 :(得分: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优化器,所以不确定其好处。