JavaScriptコードを「縮小」する方法


99

JQueryには2つのダウンロードバージョンがあり、1つは製品版(19KB、縮小およびGzip圧縮)で、もう1つは開発版(120KB、非圧縮コード)です。

これでコンパクトな19kbバージョンです。ダウンロードすると、まだJavaScript実行可能コードであることがわかります。彼らはどのようにそれをコンパクトにしたのですか?そして、どうすればそのようにコードを「縮小」することができますか?


1
特に、これを可能にするオンラインユーティリティはありますか?
KalEl 2009年

2
私は同じ質問でこの古い投稿に出会ったので、良い質問です!いくつかの優れた基本情報:thiscouldbeuseful.com/2012/09/minified-js-for-beginners.html
Aries51 2012

回答:


48

DIYの縮小

どの縮小版も、不正なコードを適切に圧縮できません。

この例では、ミニファイアがどの程度機能するかを示します。

縮小する前にすべきこと

そしてjQueryに関して...私はjQueryを使用しません.jQueryは古いブラウザ用です、それは互換性の理由で作られました.. caniuse.comを確認してください、ほとんどすべてがすべてのブラウザで動作します(IE10も現在標準化されています)、私は今それだと思いますここだけでWebアプリケーションの速度が低下します...必要に応じて$()、独自の単純な関数を作成する必要があります。また、クライアントが100kbのjqueryスクリプトをダウンロードする必要がある場合に、コードを圧縮する必要があるのはなぜですか。圧縮されていないコードのサイズはどれくらいですか。5-6kb ..?簡単にするために追加した多数のプラグインについて話す必要はありません。

元のコード

関数を書くとき、アイデアが出てきて、何かを書き始め、時には次のコードのようなものになってしまいます。コードは機能します。今ではほとんどの人が考えをやめ、これを縮小版に追加して公開します。

function myFunction(myNumber){
     var myArray = new Array(myNumber);
     var myObject = new Object();
     var myArray2 = new Array();
     for(var myCounter = 0 ; myCounter < myArray.length ; myCounter++){
         myArray2.push(myCounter);
         var myString = myCounter.toString()
         myObject[ myString ] = ( myCounter + 1 ).toString();
     }
    var myContainer = new Array();
    myContainer[0] = myArray2;
    myContainer[1] = myObject;
    return myContainer;
}

これは縮小されたコードです(私は新しい行を追加しました)

使用して縮小http://javascript-minifier.com/

function myFunction(r){
 for(var n=new Array(r),t=new Object,e=new Array,a=0;a<n.length;a++){
  e.push(a);
  var o=a.toString();
  t[o]=(a+1).toString()
 }
 var i=new Array;
 return i[0]=e,i[1]=t,i
}

しかし、それらすべての変数、ifs、ループ、および定義が必要ですか?

ほとんどの場合、NOです。

  1. 不要なif、loop、varを削除
  2. 元のコードのコピーを保管してください
  3. 縮小版を使用する

オプション(パフォーマンスが向上し、コードが短くなります)

  1. 省略演算子を使用する
  2. ビット演算子を使用する(使用しないでくださいMath
  3. 一時変数にはa、b、c ...を使用します
  4. 古い構文を使用(whilefor...しないforEach
  5. 関数の引数をプレースホルダーとして使用する(場合によっては)
  6. 不要なものを取り除く "{}","()",";",spaces,newlines
  7. 縮小版を使用する

さて、ミニファイアがコードを圧縮できる場合は、間違って実行しています。

どの縮小版も、不正なコードを適切に圧縮できません。

DIY

function myFunction(a,b,c){
 for(b=[],c={};a--;)b[a]=a,c[a]=a+1+'';
 return[b,c]
}

上記のコードとまったく同じです。

パフォーマンス

http://jsperf.com/diyminify

あなたは常にあなたが必要なものを考える必要があります:

「誰もが以下のようなコードを書くことはない」と言う前に、ここで最初の10の質問を確認してください...

以下は、10分ごとに表示される一般的な例です。

再利用可能な状態が欲しい

if(condition=='true'){
 var isTrue=true;
}else{
 var isTrue=false;
}
//same as
var isTrue=!!condition

存在する場合のみ警告します

if(condition==true){
 var isTrue=true;
}else{
 var isTrue=false;
}
if(isTrue){
 alert('yes');
}
//same as
!condition||alert('yes')
//if the condition is not true alert yes

はいまたはいいえのアラート

if(condition==true){
 var isTrue=true;
}else{
 var isTrue=false;
}
if(isTrue){
 alert('yes');
}else{
 alert('no');
}
//same as
alert(condition?'yes':'no')
//if the condition is true alert yes else no

数値を文字列に、またはその逆に変換します

var a=10;
var b=a.toString();
var c=parseFloat(b)
//same as
var a=10,b,c;
b=a+'';
c=b*1

//shorter
var a=10;
a+='';//String
a*=1;//Number

数値を丸める

var a=10.3899845
var b=Math.round(a);
//same as
var b=(a+.5)|0;//numbers up to 10 decimal digits (32bit)

数をフロア

var a=10.3899845
var b=Math.floor(a);
//same as
var b=a|0;//numbers up to 10 decimal digits (32bit)

スイッチケース

switch(n)
{
case 1:
  alert('1');
  break;
case 2:
  alert('2');
  break;
default:
  alert('3');
}

//same as
var a=[1,2];
alert(a[n-1]||3);

//same as
var a={'1':1,'2':2};
alert(a[n]||3);

//shorter
alert([1,2][n-1]||3);
//or
alert([1,2][--n]||3);

キャッチしてみてください

if(a&&a[b]&&a[b][c]&&a[b][c][d]&&a[b][c][d][e]){
 console.log(a[b][c][d][e]);
}

//this is probably the onle time you should use try catch
var x;
try{x=a.b.c.d.e}catch(e){}
!x||conole.log(x);

もっとなら

if(a==1||a==3||a==5||a==8||a==9){
 console.log('yes')
}else{
 console.log('no');
}

console.log([1,3,5,8,9].indexOf(a)!=-1?'yes':'no');

これindexOfを読むのは遅いですhttps://stackoverflow.com/a/30335438/2450730

1000000000000
//same as
1e12

var oneDayInMS=1000*60*60*24;
//same as
var oneDayInMS=864e5;

var a=10;
a=1+a;
a=a*2;
//same as
a=++a*2;

ビットワイズ/略記について私が見つけたいくつかの素晴らしい記事/サイト:

http://mudcu.be/journal/2011/11/bitwise-gems-and-other-optimizations/

http://www.140byt.es/

http://www.jquery4u.com/javascript/shorthand-javascript-techniques/

お気に入りの検索エンジンで検索した場合、短縮形とビットウィージーのパフォーマンスを示す多くのjsperfサイトもあります。

私は何時間も行くことができました。しかし、今のところそれで十分だと思います。

質問がある場合は、質問してください。

そして覚える

どの縮小版も、不正なコードを適切に圧縮できません。


30
コードを手動で縮小する理由はほとんどありません。他の開発者(または10か月後)が簡単に理解できるコードを記述します。はい、シンプルな方が良いです。オリジナルを保持する自動ビルドプロセスで縮小版を使用します。ほとんどすべての場合で、手による最適化による速度の向上は、開発者が縮小コードを解読するコストによってはるかに大きく補われます。
alttag 2014

4
あなたがやっていることに依存します。たとえば、アニメーション/キャンバス、巨大なデータセット、ファイル操作などの作業を行う場合、特にモバイルデバイスでは、高速なコードが非常に重要です...重要なのは、一部の開発者にとっては読みにくいということです。ペンティアム2 ..多分1998年、私はコードを読むことができ、私の経験では、エラーをチェックするためのコードが少なくなっています。パフォーマンスビット単位を使用して増加/と複雑な機能で速記insane.expecially shorthandbitwise JavaScriptをGoogleとあなたは多くの例を見つけるbrowsers.use /さまざまなデバイス上でテストしている
Coccoの

あなたの丸めの例を(10.4899845 +.5)|0
もう一度言うと

DIYコードが「最適化された」ファイルに追加されました。ゼロより小さい値(myNumberまたはa)が提供された場合、元のコードが行うことを正確には行いません。元のコードは例外をスローし、「改善された」コードは無限ループに入ります。
ドナルドリッチ

サポータビリティの観点からすると、このような悪いアドバイスのように聞こえます
donkz



3

圧縮に加えて、base64でエンコードすることもできます。それはあなたのファイルをはるかに圧縮します。パラメータ(p、a、c、k、e、r)が渡されたeval()関数内にラップされたjsファイルを見たことがあると思います。この記事を読んだ Javascriptファイルを縮小する方法は?


base64エンコードはコードを圧縮しません。正反対に圧縮し、最終的に文字数が増えます。文字列をLZH圧縮できます。誰かがgithubでJSスクリプトを作成し、次の名前の文字列でLZH圧縮を行います。これを使用してコードを圧縮できます:pieroxy.net/blog/pages/lz-string/index.html
beliha

3

スクリプトを縮小するためにAPIを呼び出す小さなスクリプトを作成しました。確認してください。

#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Request;
use Fcntl;

my %api = ( css => 'https://cssminifier.com/raw', js => 'https://javascript-minifier.com/raw' );

my $DEBUG = 0;

my @files = @ARGV;

unless ( scalar(@files) ) {
    die("Filename(s) not specified");
}

my $ua = LWP::UserAgent->new;

foreach my $file (@files) {
    unless ( -f $file ) {
        warn "Ooops!! $file not found...skipping";
        next;
    }

    my ($extn) = $file =~ /\.([a-z]+)/;

    unless ( defined($extn) && exists( $api{$extn} ) ) {
        warn "type not supported...$file...skipping...";
        next;
    }

    warn "Extn: $extn, API: " . $api{$extn};

    my $data;

    sysopen( my $fh, $file, O_RDONLY );
    sysread( $fh, $data, -s $file );
    close($fh);

    my $output_filename;

    if ( $file =~ /^([^\/]+)\.([a-z]+)$/ ) {
        $output_filename = "$1.min.$2";
    }

    my $resp = $ua->post( $api{$extn}, { input => $data } );

    if ( $resp->is_success ) {
        my $resp_data = $resp->content;
        print $resp_data if ($DEBUG);
        print "\nOutput: $output_filename";

        sysopen( my $fh, $output_filename, O_CREAT | O_WRONLY | O_TRUNC );
        if ( my $sz_wr = syswrite( $fh, $resp_data ) ) {
            print "\nOuput written $sz_wr bytes\n";
            my $sz_org = -s $file;

            printf( "Size reduction %.02f%%\n\n", ( ( $sz_org - $sz_wr ) / $sz_org ) * 100 );
        }   
        close($fh);
    }
    else {
      warn: "Error: $file : " . $resp->status_line;
    }
}

使用法:

./minifier.pl a.js c.css b.js cc.css t.js j.js [..]

1

最近、同じタスクを実行する必要がありました。JavaScript CompressorRaterにリストされているコンプレッサーは素晴らしい働きをし、ツールは非常に便利ですが、私が使用している一部のjQueryコード($ .getScriptおよびjQuery.fnチェック)ではコンプレッサーはうまく機能しませんでした。Google Closure Compressorでさえ同じ線で窒息しました。私は最終的にはよじれを解決することができたかもしれませんが、絶えず行うことははるかに細かいことでした。

最終的に問題なく機能したのはUglifyJS@ Aries51に感謝)で、圧縮は他の圧縮よりわずかに少なかっただけです。Googleと同様に、HTTP APIを備えています。 パッカーも素晴らしく、Perl、PHP、および.NETで言語を実装しています。


1

現在、コードを縮小する方法は2つあります。

  1. アプリケーションのバックエンド側でミニファイアを適用します-ここでの利点は、バージョニングを適用でき、コードをより細かく制御できることです-ミニファイのプロセスを実質的に完全に自動化でき、コードが作成される前に適用することがベストプラクティスです。サーバーにアップロード-これは、多くのフロントエンド(縮小する)JavaScriptおよびCSSコードがある場合に最適です。

http://yui.github.io/yuicompressor/

そのようなツールの多くは、Nodeとnpmでも使用できます。GruntでJavaScriptの修正を自動化することをお勧めします。

  1. オンラインで実行されている既存の無料の縮小ツールを使用できます。これらのツールを使用すると、実際には同じことを手動で行うことができます。私はあなたがあなたのjavascript / cssコードの量が少ないときそれらを使うことを勧めます-多くのファイルではありません

http://www.modify-anything.com/


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.