每次我的greasemonkey脚本启动时,我都会自动加载许多不同的正则表达式模式。在任何阶段都不需要95%的已加载内存,因此我想找到一种方法,即使我知道它不会被使用,也不要将这些数据放入内存中。
以此为基本示例:
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 : /./,
},
];
....以及更多模式。
如果网址与当前网址(location.href)不匹配,我无需加载任何数据。
答案 0 :(得分:3)
最好的方法是,您可以通过GM_getResourceText + eval按需加载数据。元数据块中定义的资源数据将在用户脚本的首次安装时下载。
文档:http://wiki.greasespot.net/Metadata_block#.40resource
您需要考虑如何存储数据 - 可能是每个站点的资源(我知道讨厌)?
另一个简化解决性能问题的简单方法是将正则表达式存储为简单字符串,并仅在需要时创建RegExp对象。例如:patterns : [".", ".", "."]
和new RegExp(the_pattern)
当实际需要表达式时。
答案 1 :(得分:1)
当且仅当需要时,使用document.write()来包含来自单独的javascript文件的数据。
答案 2 :(得分: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;
虽然这样你最初仍然将它全部加载到内存中,但是不保留页面整个生命周期内不需要的对象。
更好的方法是在将每个对象添加到模式数组之前逐个测试每个对象,并且只添加与当前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 : /./,
})
答案 3 :(得分:0)
由于这是一个GreaseMonkey脚本,我认为它驻留在用户的机器上,而不是从外部站点生成。如果情况并非如此,您可能需要考虑基于URL动态生成JavaScript。
否则,您可以将模式分配JavaScript存储在单独的文件中,仅根据加载的站点的URL检索其中一个文件,并通过eval()运行其内容,就像它是JSON请求一样。