1

Google ClosureYahooのYUIの両方を使用してみましたが、繰り返しの長い行は縮小されません。これを修正するために私は追加しました:

var M = 
{
    m1:  function( html_id, method_call )
    {
        return ( document.getElementById( html_id ).onclick = method_call );
    }
};

書く代わりに

document.getElementById(test).onclik = test;

書ける

M.m1(test,test);

ただし、これによりコードが読みにくくなります。私のためにこれを行うために私が見逃しているオプションはありますか?確かにグーグルやヤフーはこれを自動的に行う方法を知っていますか?

4

4 に答える 4

1

おそらく、閉鎖とYUIは、クランチ時に「十分に最適」ではありません。いくつかのインスピレーションを得るために、 js1kコンペティションエントリを見ることができます。

この投稿では、手動で実行できるいくつかのことの概要を説明します。

これは、最小化で(たとえば、クロージャーやYUIよりも)優れた仕事をする可能性のあるコンプレッサーツールの例です。

于 2012-05-12T18:12:18.027 に答える
0

問題は、長い行が縮小されていないことではなく、「document」がJS環境によってプロパティ名が固定されているホストオブジェクトであるということです。ミニファイアは、変数の名前を短い名前に変更することで機能しますが、「ドキュメント」または他のホストオブジェクトのプロパティの名前を変更することはできません。

コードの大部分がこれらの繰り返し行に含まれている場合は、毎回「ドキュメント」を直接使用するのではなく、これらすべての場所で呼び出す関数に機能をまとめる必要があります。コードのいくつかの例は、それを行う方法についてより具体的にするのに役立ちます。

于 2012-05-12T17:34:24.070 に答える
0
  1. JSで繰り返し実行するアクションのリストを取得します

  2. これらすべての関数を定義し、スクリプトの先頭にカスタム名を付けて、必要な場所でこれらの関数を使用します(ここを参照してください) 。

  3. ここでjavaScriptを圧縮/縮小します

お役に立てれば。

于 2012-05-12T17:37:19.533 に答える
0

読み取り不可能な変数名を作成したため、読み取り不能です。関連する変数名を作成してからコンパイルしてみませんか。

document.getElementById名前を変更することはできませんが、名前を変更できる関数を返す関数を作成できますdocument.getElementById

var getElementById = function(id){
  return document.getElementById(id);
}
var getElementByIdClick = function(id, method_call){
    return getElementById(id).onclick = method_call;
}

これはにコンパイルすることができます

function f(h) {
  return document.getElementById(h);
}
function g(h, k) {
  return f(h).onclick = k;
}

または

function f(h){return document.getElementById(h)}function g(h,k){return f(h).onclick=k}

クロージャーコンパイラーの秘訣は、できるだけ多くの変数を使用することです。一般的には良い考えではありませんが、クロージャーは非常に優れているため、何が最適かを決定します。

したがって、繰り返し発生するコードを関数に移動するだけでなく、すべての「ドット表記」を「角かっこ表記」に交換し、すべてのプロパティとメソッド名に変数を使用できます。

これは極端な例です。

var _document=document,getElementById='getElementById', id='test',onclick='onclick',method_call=function(){};
_document[getElementById](id)[onclick] = method_call;

クロージャコンパイラは、角かっこを使用するかどうかを決定します。使用する場合は、変数の名前が変更されます。

あなたはこれで終わる可能性があります。

var a=document,b='getElementById',c='test',d='onclick',e=function(){};
a[b](c)[d]=e;

または、ドット表記に置き換えてすべての変数を削除する場合もありますが、少なくともオプションを指定しています。

document.getElementById('test').onclick=function(){} //method_call

document.getElementById('test')これにコンパイルすることはできませんa[b](c)

クロージャーコンパイルADVANCED_OPTIMIZATIONSオプションは関数の名前を変更しますが、関数が使用される回数を考慮に入れます。関数が完全に削除され、代わりに使用される場合があります。document.getElementById

于 2016-03-15T11:15:14.333 に答える