[英]Javascript: loading mass amount of data in memory based on condition
每当我的油脂猴子脚本启动时,我都会自动加载许多不同的正则表达式模式。 在任何阶段都不需要此加载的内存的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)不匹配,则不需要加载任何数据。
最好的方法是是否可以通过GM_getResourceText + eval按需加载数据。 元数据块中定义的资源数据将在用户脚本的首次安装时下载。
文档: http : //wiki.greasespot.net/Metadata_block#.40资源
您需要考虑如何存储数据-可能是每个站点的资源(我知道这很讨厌)?
缓解性能问题的另一个更简单的解决方案是将正则表达式存储为简单字符串,并仅在需要时创建RegExp对象。 例如: patterns : [".", ".", "."]
和实际需要表达式时的new RegExp(the_pattern)
。
当且仅当需要时,使用document.write()包含来自单独的javascript文件的数据。
您可以坚持使用当前的模式定义,并删除所有不需要的模式:
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 : /./,
})
由于这是GreaseMonkey脚本,因此我假设它位于用户的计算机上,而不是从外部站点生成的。 如果不是这种情况,您可能要考虑根据URL动态生成JavaScript。
否则,您可以将模式分配JavaScript存储在单独的文件中,根据加载的站点的URL仅检索其中一个文件,并通过eval()来运行其内容,就好像它是JSON请求一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.