0

グリースモンキースクリプトが起動するたびに、さまざまな正規表現パターンが自動的に読み込まれます。このロードされたメモリの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

データを保存する方法を考える必要があります-おそらくサイトごとのリソース(厄介なことです)?

パフォーマンスの問題を軽減するためのもう 1 つの簡単な解決策は、正規表現を単純な文字列として保存し、必要な場合にのみ 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;

この方法では、最初はすべてをメモリにロードしますが、ページの存続期間全体で必要のないオブジェクトは保持しません。

より良い方法は、各オブジェクトをパターン配列に追加する前に一度に 1 つずつテストし、現在の 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に基​​づいてファイルの1つのみを取得し、JSONリクエストであるかのようにeval()を介してそのコンテンツを実行できます。

于 2009-02-10T22:29:00.767 に答える