2013-04-25 42 views
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 
}); 

回答

1

只是一個想法,但你可以創建一個autoDefine函數,它會生成一個新的函數,然後生成所需的對象。

DEMO: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; 
    }); 
} 

這裏有performance tests那就說明autoDefine2執行方式比autoDefine更好。

+0

嗨,我不知道保留依賴數組與功能正文編碼的性能差異是什麼。我猜想JS運行時會有所不同。無論哪種方式,一旦模塊被實現,我認爲沒有什麼能夠阻止AMD框架刪除工廠功能。這也可以釋放封閉的陣列。 – 2013-04-25 21:37:59

+0

不幸的是,這兩種解決方案都不能編譯@ paulgrime的解決方案。不知道爲什麼。你的解決方案提出錯誤'ENOENT,沒有這樣的文件或目錄'試圖找到'simba.js'。 – ThomasReggi 2013-04-25 22:29:48

+0

我想如果模塊名稱作爲第一個參數傳遞給'define',那麼第二個參數需要是依賴數組。 – 2013-04-25 22:36:46

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優化器,所以不確定好處。

+0

這編譯,但它給了我一個控制檯的錯誤,似乎元,滑塊,快速瀏覽等沒有被導入,它正在尋找他們在本地項目中(錯誤的目錄)。 – ThomasReggi 2013-04-26 01:59:32