1

Google Closure Compiler を使用していくつかのコードを単純な最適化でテストしていますが、驚いたことに次のような関数があります。

window.navigator.detect = function() {
  var t = this,
  a = t.userAgent.toLowerCase(),
  match = /(chrome|webkit|firefox|msie)[ \/]([\w.]+)/.exec(a) ||
  /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a) ||
  a.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a) || [];

  t.ua = match[1] || false;
  t.vers = match[2] || "0";
  if (t.ua) t[match[1]] = true;
  if (match = t.msie)
  t.ie = parseInt(t.vers);//ie main version or false if not IE
  else if (t.chrome)
  t.webkit = true;
  else if (t.webkit)
  t.safari = true;
  //css prefix
  t.pre = t.webkit ? '-webkit-' : t.firefox ? '-moz-' : t.ie > 7 ? '-ms-' : t.opera ? '-o-' : '';
}
window.navigator.detect();

になる:

window.navigator.detect = function() {
  var a = this.userAgent.toLowerCase(), a = /(chrome|webkit|firefox|msie)[ \/]([\w.]+)/.exec(a) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a) || 0 > a.indexOf("compatible") && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a) || [];
  this.ua = a[1] || !1;
  this.vers = a[2] || "0";
  this.ua && (this[a[1]] = !0);
  this.msie ? this.ie = parseInt(this.vers) : this.chrome ? this.webkit = !0 : this.webkit && (this.safari = !0);
  this.pre = this.webkit ? "-webkit-" : this.firefox ? "-moz-" : 7 < this.ie ? "-ms-" : this.opera ? "-o-" : ""
};
window.navigator.detect();

17回使用される長い「this」の代わりに、「this」への参照としてより小さな「t」変数を使用して、いくつかのバイトを節約したかったのです。この場合、Closure Compiler によってコードが長くなりますが、これは皮肉なことです。これが意図されているかどうかはわかりません。また、Google のドキュメントには関連するものは何もありません。

この種の警告を防ぐ方法はありますか?

4

1 に答える 1

1

私は自分自身で、さらにグーグルで見つけました...答えは、Closure Compilerの文字列のインライン化に関するこの問題に似ています: Google Closureの変数

そして、 FAQ に関するこの難問:

" Closure Compiler はすべての文字列をインライン化したため、コード サイズが大きくなりました。なぜそうなったのでしょうか?ほとんどの人は、圧縮されていない 2 つの JavaScript ファイルを見てコード サイズを比較します。 "..." gzip アルゴリズムは、最適な方法でバイト シーケンスにエイリアスを設定することで機能します。手動で文字列にエイリアスを設定すると、ほとんどの場合、圧縮されたコードのサイズが大きくなります。エイリアシングのための独自のアルゴリズム。」

't' var を関数引数として渡してみました:window.navigator.detect(window.navigator);を使用window.navigator.detect = function(t){}して、短い 1 文字の変数を保持します。しかし、「コンパイル済みサイズ」で 27 バイト節約できますが、「gzip 圧縮サイズ」は実際には 1 バイト大きくなっています...

したがって、ここでは文字列のエイリアシングがすべてではありませんが、gzip の最終結果は同様であり、サイズの縮小という点で最も重要な点です。

于 2013-04-25T09:39:08.980 に答える