2009-02-10 60 views
0

我有很多不同的正則表達式模式,每次我的greasemonkey腳本啓動時自動加載。在任何階段都不需要這個加載的內存的95%,所以我想找到一種方法,即使我知道它不會被使用,甚至不會將該數據放入內存中。Javascript:基於條件加載海量數據的內存爲

此以一個簡單的例子:

var patterns = [ 
    { 
    name : 'p1', 
    url  : 'http://www.someurl.com', 
    pattern1 : /./, 
    pattern2 : /./, 
    pattern3 : /./, 
    }, 
    { 
    name : 'p2', 
    url  : 'http://www.someurl2.com', 
    pattern1 : /./, 
    pattern2 : /./, 
    pattern3 : /./, 
    }, 
    { 
    name : 'p3', 
    url  : 'http://www.someurl3.com', 
    pattern1 : /./, 
    pattern2 : /./, 
    pattern3 : /./, 
    }, 

]; 

....等等模式。

如果url與當前url(location.href)不匹配,則不需要加載任何數據。

+0

我不確定我的理解。你可以擴大一點嗎? – 2009-02-10 22:27:50

回答

3

最好的方法是如果您可以通過GM_getResourceText + eval按需加載數據。元數據塊中定義的資源數據將在userscript首次安裝時下載。

文檔:http://wiki.greasespot.net/Metadata_block#.40resource

你需要考慮如何存儲數據 - 每個站點可能資源(討厭我知道)?

緩解性能問題的另一個更簡單的解決方案是將正則表達式存儲爲簡單的字符串,並僅在需要時才創建RegExp對象。例如:patterns : [".", ".", "."]new RegExp(the_pattern)實際需要表達式時。

+0

這是一個很好的方法,特別是在需要時才啓動模式。這可以馬上實施。 – 2009-02-11 11:59:36

1

當且僅當需要時,使用document.write()包含來自單獨的javascript文件的數據。

+0

我想你誤解了這個問題... – 2009-02-10 22:20:19

0

由於這是一個GreaseMonkey腳本,我假設它駐留在用戶的機器上,而不是從外部站點生成的。如果情況並非如此,您可能需要考慮根據URL來即時生成JavaScript。否則,您可以將模式分配JavaScript存儲在單獨的文件中,僅基於加載的站點的URL檢索其中一個文件,並通過eval()運行其內容,就像它是JSON請求一樣。

+0

我想過這樣做,但我不會有成千上萬的JavaScript文件和大量的重複數據?它可能變得非常混亂。理想情況下,我想要一個內置於JavaScript的函數,它只在訪問時加載var中的內容。 – 2009-02-10 22:42:23

1

您可以與您當前的模式定義堅持並刪除所有的模式你不需要:

var patterns = [ 
    //patterns array as defined in question 
]; 
var newpatterns = []; 
var count = 0; 

for (var i = 0 ; i < patterns.length ; i++){ 
    if (href.indexOf(patterns[i].url) == -1) { 
    newpatterns[count++] = patterns[i]; 
    console.log("remove " + patterns[i].name); 
    } 
} 
patterns = newpatterns; 

儘管這樣你還是加載所有到內存開始,但不能保持你的對象不需要整個頁面的整個生命週期。

更好的方法是在添加到patterns數組之前逐個測試每個對象,並只添加與當前url相關的對象。

var patterns = []; 
var count = 0; 

var href = window.location.href; 

function addPattern(p){ 
    if (href.indexOf(p.url) != -1) patterns[count++] = p; 
} 

addPattern({ 
    name : 'p1', 
    url  : 'http://www.someurl.com', 
    pattern1 : /./, 
    pattern2 : /./, 
    pattern3 : /./, 
    }) 

addPattern({ 
    name : 'p2', 
    url  : 'http://www.someurl2.com', 
    pattern1 : /./, 
    pattern2 : /./, 
    pattern3 : /./, 
    }) 

addPattern({ 
    name : 'p3', 
    url  : 'http://www.someurl3.com', 
    pattern1 : /./, 
    pattern2 : /./, 
    pattern3 : /./, 
    }) 
+0

這是一個好主意,但它並不真正起作用,因爲您仍然將對象加載到內存中,將對象傳遞給函數,然後將對象加載到內存的另一部分。看起來比以前更多的工作! ;-) – 2009-02-13 09:11:17