자바 스크립트 코드를 '축소'하는 방법


99

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

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


1
특히이 작업을 수행 할 수있는 온라인 유틸리티가 있습니까?
KalEl

2
나는 같은 질문 으로이 오래된 게시물을 우연히 발견했습니다. 몇 가지 좋은 기본 정보 : thiscouldbeuseful.com/2012/09/minified-js-for-beginners.html .
Aries51

답변:


48

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도 잘못된 코드를 적절하게 압축 할 수 없습니다.


30
코드를 직접 축소 할 이유가 거의 없습니다. 다른 개발자 (또는 10 개월 후)가 쉽게 이해할 수있는 코드를 작성합니다. 예, 간단할수록 좋습니다. 원본을 보존하는 자동화 된 빌드 프로세스에서 축소 된 것을 사용하십시오. 거의 모든 경우에 수작업 최적화로 인한 속도 향상은 개발자가 축소 된 코드를 해독하는 데 드는 비용보다 훨씬 큽니다.
alttag

4
당신이하는 일에 달려 있습니다. 예를 들어 애니메이션 / 캔버스, 방대한 데이터 세트 및 파일 매니 폴 레이션으로 작업하는 경우 특히 모바일 장치에서 빠른 코드가 매우 중요합니다 ... 요점은 일부 개발자에게는 읽기가 어렵다는 것입니다. the pentium 2 .. 그래서 아마도 1998 년에, 나는 코드를 읽을 수 있고, 경험상 오류를 검사 할 코드가 적습니다. 그리고 속도에 관해서는 .. mh, 틀 렸습니다. 복잡한 함수에서 비트 / 및 속기를 사용하여 성능 향상은 미쳤습니다. 다양한 장치 / 브라우저에서 특수하게 테스트하고 있습니다. google shorthandbitwise javascript를 사용하면 많은 예를 찾을 수 있습니다
cocco 2014-08-12

반올림 예 : (10.4899845 +.5)|0결과는 11 대신 10입니다.
DanMan

DIY 코드가 내 "과도하게 최적화 된"파일에 추가되었습니다. 0보다 작은 값 (myNumber 또는 a)이 제공 될 때 원래 코드가 수행하는 작업을 정확히 수행하지 않습니다. 원래 코드에서 예외가 발생하고 "개선 된"코드가 무한 루프에 들어갑니다.
Donald Rich

지원 가능성 관점에서 보면 나쁜 조언처럼 들립니다
donkz



3

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


base64 인코딩은 코드를 압축하지 않고 정확히 반대로 수행하므로 더 많은 문자로 끝납니다. 당신은 LZH Compress your string을 할 수 있습니다. 누군가는 lz-string이라는 문자열에 LZH Compression을하는 github에 JS 스크립트를 만들었습니다. 당신은 이것을
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

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

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


1

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

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