0

每次我的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 : /./,
   },

 ];

....还有更多的模式。

如果 url 与当前 url (location.href) 不匹配,我不需要加载任何数据。

4

4 回答 4

3

最好的方法是通过 GM_getResourceText+eval 按需加载数据。元数据块中定义的资源数据将在用户脚本的第一次安装时下载。

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

您需要考虑如何存储数据 - 可能是每个站点的资源(我知道很讨厌)?

缓解性能问题的另一个更简单的解决方案是将正则表达式存储为简单的字符串,并仅在需要时创建 RegExp 对象。例如:当实际需要表达式时patterns : [".", ".", "."]new RegExp(the_pattern)

于 2009-02-11T10:01:57.623 回答
1

当且仅当需要时,使用 document.write() 包含来自单独的 javascript 文件的数据。

于 2009-02-10T22:10:00.050 回答
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 : /./,
   })
于 2009-02-12T17:19:36.327 回答
0

由于这是一个 GreaseMonkey 脚本,我假设它驻留在用户的机器上,而不是从外部站点生成的。如果不是这种情况,您可能需要考虑根据 URL 动态生成 JavaScript。

否则,您可以将模式分配 JavaScript 存储在单独的文件中,根据加载的站点的 URL 仅检索其中一个文件,并通过 eval() 运行其内容,就像它是一个 JSON 请求一样。

于 2009-02-10T22:29:00.767 回答