[javascript] 자바 스크립트 코드를 ‘축소’하는 방법

JQuery 에는 두 가지 다운로드 버전이 있습니다. 하나는 Production (19KB, Minified 및 Gzipped) 이고 다른 하나는 Development (120KB, Uncompressed Code) 입니다.

이제 컴팩트 19kb 버전을 다운로드하면 여전히 javascript 실행 코드임을 알 수 있습니다. 그들은 그것을 어떻게 압축 했습니까? 그리고 어떻게 그렇게 내 코드를 ‘축소’할 수 있습니까?



답변

DIY 축소

어떤 minifier도 잘못된 코드를 적절하게 압축 할 수 없습니다.

이 예에서는 minifier가 얼마나 많은지 보여주고 싶습니다.

축소하기 전에해야 할 일

그리고 jQuery와 관련하여 … 나는 jQuery를 사용하지 않습니다 .jQuery는 오래된 브라우저 용입니다. 호환성 이유로 만들어졌습니다. 웹 애플리케이션의 속도를 늦추기 위해 여기에 있습니다 … $()자신 만의 간단한 함수를 만들어야하는 경우 클라이언트가 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
}

그러나 모든 vars, ifs, 루프 및 정의가 필요합니까?

대부분 NO !

  1. 불필요한 if, loop, var 제거
  2. 원본 코드 사본 보관
  3. 미니 파이어 사용

선택 사항 (성능 향상 및 코드 단축)

  1. 속기 연산자 사용
  2. 비트 연산자 사용 (사용하지 마십시오 Math)
  3. 임시 변수에 a, b, c … 사용
  4. 이전 구문 사용 ( while, for… not forEach)
  5. 함수 인수를 자리 표시 자로 사용 (일부 경우)
  6. 불필요한 제거 "{}","()",";",spaces,newlines
  7. 미니 파이어 사용

이제 축소 기가 코드를 압축 할 수 있다면 잘못한 것입니다.

어떤 minifier도 잘못된 코드를 적절하게 압축 할 수 없습니다.

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/

좋아하는 검색 엔진으로 검색하면 속기 및 bitwsie의 성능을 보여주는 jsperf 사이트도 많이 있습니다.

몇 시간 동안 갈 수 있지만 .. 지금은 충분하다고 생각합니다.

질문이 있으면 물어보세요.

그리고 기억하세요

어떤 minifier도 잘못된 코드를 적절하게 압축 할 수 없습니다.


답변

사용 가능한 많은 javascript minifier 중 하나를 사용할 수 있습니다.


답변

Google은 코드를 최소화하고, 죽은 코드 분기를 제거하고, 더 많은 최적화를 할 수있는 자바 스크립트 컴파일러를 제공했습니다.

구글 자바 스크립트 컴파일러

감사합니다
K


답변

축소와 함께 base64로 인코딩 할 수도 있습니다. 파일을 훨씬 더 압축합니다. 매개 변수 (p, a, c, k, e, r)가 전달 된 eval () 함수 내부에 래핑 된 js 파일을 보았을 것입니다. 이 기사 에서 Javascript 파일을 축소하는 방법을 읽었습니다 .


답변

스크립트를 축소하기 위해 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 [..]


답변

나는 최근에 같은 작업을 수행해야했습니다. The JavaScript CompressorRater에 나열된 압축기 가 훌륭한 작업을 수행하고 도구가 매우 유용하지만, 압축기는 내가 사용중인 일부 jQuery 코드 ($ .getScript 및 jQuery.fn 검사)에서 제대로 작동하지 않았습니다. Google Closure Compressor 조차도 같은 줄에 질식했습니다. 결국 꼬임을 다듬을 수 있었지만 지속적으로 수행하는 것은 곁눈질로 멀었습니다.

마침내 문제없이 작동 한 것은 UglifyJS ( @ Aries51 감사합니다 ) 였고 압축은 다른 모든 것보다 약간 적었습니다. 그리고 Google과 유사하게 HTTP API가 있습니다. Packer 는 또한 훌륭하며 Perl, PHP 및 .NET에서 언어 구현이 있습니다.


답변

현재 코드를 축소하는 방법에는 두 가지가 있습니다.

  1. 애플리케이션의 백엔드 측에 미니 파이어를 적용합니다. 여기서 장점은 버전 관리를 적용 할 수 있고 코드를 더 잘 제어 할 수 있다는 것입니다. 최소화 프로세스를 실질적으로 완전히 자동화 할 수 있으며 코드가 완성되기 전에 적용하는 것이 가장 좋습니다. 서버에 업로드-많은 프론트 엔드 (최소화 될) 자바 스크립트 및 CSS 코드가있을 때 가장 잘 사용됩니다.

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

이러한 도구는 Node 및 npm에서도 사용할 수 있습니다. Grunt를 사용하여 Javascript를 자동화하는 것이 좋습니다.

  1. 온라인에서 실행되는 축소를 위해 기존 무료 도구 중 일부를 사용할 수 있습니다. 이러한 도구를 사용하면 실제로 동일한 작업을 수행 할 수 있지만 수동으로 수행 할 수 있습니다. javascript / css 코드의 양이 적을 때 사용하는 것이 좋습니다. 파일이 많지 않습니다.

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