2013-05-06 77 views
2

每個javascript開發人員都知道; EVAL是邪惡使用eval的Javascript模塊();

但由於我在尋找ultimative模塊技術在JavaScript中,我使用eval作爲一個模塊加載器,它有兩個主要好處讀一些關於某人很有意思:移動

  • 加載速度更快由於其裝載整個字符串一次
  • 腳本沒有分隔條件各個模塊

所以什麼一回事,在做花哨的定義封裝類,如require.js?它可能是一個解決方案,只通過eval加載幾個功能?我從安全性方面的意思是......

編輯:SRY忘了的文章鏈接:Article

+1

我認爲你可以100%控制靜態字符串(你的代碼 - 你計劃執行,只是延遲加載)是好的。 – Patashu 2013-05-06 09:37:10

+2

我不明白爲什麼要將代碼加載爲字符串,而不是腳本文件,爲什麼這會更快? – Bergi 2013-05-06 10:19:18

+2

很難調試評估腳本。沒有優化。但這是「很好的評估」:http://www.youtube.com/watch?v=Kdwwvps4J9A – 3y3 2013-05-06 10:43:02

回答

5

因爲3G連接一個HTTP請求,甚至更多的數據的高延遲的,往往是很多比多個更小的請求更快。

這篇文章提出了什麼是多個模塊組合成一個文件是這樣的:

var modules = { 
    'main.js': 'alert("Main module")', 
    'another.js': 'alert("Another module")', 
    'notUsed.js': 'alert("I am never used")', 
}; 

這樣,他們都可以用這是更快了一個HTTP請求下載的,你仍然可以只包括/評估你需要的模塊。

例如你可以這樣做:

var requireFile = function(file) { 
    if(modules[file]) 
     eval(modules[file]); 
}; 

requireFile('main.js'); 
requireFile('another.js'); 

只有main.jsanother.js會進行評估,notUsed.js也只是被忽略。

安全方面,通過<script>標籤包含它們應該沒有什麼不同,前提是用於組合腳本的任何內容都不會意外地組合/包含其他文件/字符串。

所以從安全的角度來看,不應該從以上,這有什麼區別:

<scruipt src="main.js"></script> 
<scruipt src="another.js"></script> 

當然,你仍然有other disadvantages of eval

+0

我正在運行requirejs/ember的問題,正在考慮走這條路線。它看起來很簡單,但我還沒有看到任何圖書館都這樣做。現在是否有大型項目正在進行這項工作?我怕以後遇到問題(例如,表演)。 – 2014-03-24 21:35:51