जावास्क्रिप्ट कोड को 'छोटा' कैसे करें


99

JQuery के डाउनलोड के लिए दो संस्करण हैं, एक है प्रोडक्शन (19KB, Minified और Gzipped) , और दूसरा है डेवलपमेंट (120KB, अनकम्प्रेस्ड कोड)

अब कॉम्पैक्ट 19kb संस्करण, यदि आप इसे डाउनलोड करते हैं, तो आप देखेंगे कि अभी भी एक जावास्क्रिप्ट निष्पादन योग्य कोड है। उन्होंने इसे कैसे संकुचित किया? और मैं इस तरह से अपने कोड को 'छोटा' कैसे कर सकता हूं?


1
विशेष रूप से, क्या कोई ऑनलाइन उपयोगिता है जो मुझे ऐसा करने देती है?
कलएएल

2
मैं इस पुराने पोस्ट पर एक ही सवाल के साथ ठोकर खाई, इतना अच्छा सवाल! कुछ अच्छी बुनियादी जानकारी: thiscouldbeuseful.com/2012/09/minified-js-for-beginners.html
मेष ५१

जवाबों:


48

DIY न्यूनतम

कोई भी मिनिफायर ठीक से एक खराब कोड को कंप्रेस नहीं कर सकता है।

इस उदाहरण में मैं सिर्फ यह दिखाना चाहता हूं कि एक मिनिफायर कितना काम करता है।

आपको मिनिमाइज करने से पहले क्या करना चाहिए

और jQuery के बारे में ... मैं पुराने ब्राउज़रों के लिए jQuery.jQuery का उपयोग नहीं करता, यह संगतता कारणों के लिए बनाया गया था .. caniuse.com की जाँच करें, लगभग हर ब्राउज़र पर सब कुछ काम करता है (यानी 10 अब मानकीकृत है), मुझे लगता है कि अब यह है बस यहाँ अपने वेब अनुप्रयोग को धीमा करने के लिए ... यदि आप की तरह $()आप अपने खुद के सरल समारोह बनाना चाहिए। और अपने ग्राहकों को 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
}

लेकिन क्या वे सभी संस्करण, आईएफ, लूप और परिभाषाएं आवश्यक हैं?

ज्यादातर समय NO !

  1. अनावश्यक निकालें यदि, लूप, var
  2. अपने मूल कोड की एक प्रति अपने पास रखें
  3. मिनीफ़ायर का प्रयोग करें

वैकल्पिक (प्रदर्शन और छोटा कोड बढ़ाता है)

  1. आशुलिपि ऑपरेटरों का उपयोग करें
  2. बिटवाइज़ ऑपरेटरों का उपयोग करें (उपयोग न करें Math)
  3. अपने अस्थायी var के लिए a, b, c ... का उपयोग करें
  4. पुराने सिंटैक्स का उपयोग करें ( while, for... नहीं 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 प्रश्नों की जांच करें ...

यहां कुछ सामान्य उदाहरण हैं जो मैं हर दस मिनट में देखता हूं।

एक पुन: प्रयोज्य स्थिति चाहते हैं

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

4
निर्भर करता है कि आप क्या कर रहे हैं। यदि आपका एनिमेशन / कैनवास, विशाल डेटासेट और फ़ाइल हेरफेर के साथ काम करना, उदाहरण के लिए, एक तेज़ कोड बहुत महत्वपूर्ण है, खासकर मोबाइल उपकरणों पर ... बिंदु है, कुछ डेवलपर्स के लिए यह पढ़ना मुश्किल है। हाँ ... मैं कोड लिखता हूं पेंटियम 2 .. तो शायद 1998, मैं कोड पढ़ सकता हूं और मेरे अनुभव में त्रुटियों की जांच करने के लिए मेरे पास कम कोड है। और गति के बारे में .. mh, आपका गलत। जटिल कार्यों में बिटवाइज़ / और शॉर्टहैंड का उपयोग करने से प्रदर्शन बढ़ जाता है। यह विभिन्न उपकरणों / ब्राउज़रों पर परीक्षण करना है। Google शॉर्टहैंडवाइज़ जावास्क्रिप्ट और आपको कई उदाहरण मिलते हैं
cocco

अपने दौर का उदाहरण दें: (10.4899845 +.5)|011. के बजाय 10 में परिणाम
DanMan

DIY कोड अभी मेरे "ओवर ऑप्टिमाइज़्ड" फ़ाइल में जोड़ा गया। यह बिलकुल नहीं करता कि मूल कोड क्या करता है जब शून्य से कम मूल्य प्रदान किया जाता है (myNumber या a)। मूल कोड एक अपवाद फेंकता है और "बेहतर" कोड एक अनंत लूप में जाता है।
डोनाल्ड रिच

समर्थन के नजरिए से ऐसी बुरी सलाह सुनने में अच्छी लगती है
डॉन

36

आप कई उपलब्ध जावास्क्रिप्ट मिनिफायरों में से एक का उपयोग कर सकते हैं।


मैं समझता हूं कि UUIifyJS ( डेमो ) के पक्ष में YUI कंप्रेसर को हटा दिया गया है ।
मार्टिन विसेटीका


3

Minizing के साथ-साथ आप base64 को भी एनकोड कर सकते हैं। यह आपकी फ़ाइल को बहुत अधिक संकुचित बनाता है। मुझे यकीन है कि आपने js फ़ाइलों को देखा है जो एक eval () फ़ंक्शन के साथ लिपटे हैं मापदंडों (p, a, c, k, e, r) के साथ। मैंने इसे इस लेख में पढ़ा कि कैसे एक जावास्क्रिप्ट फ़ाइल को छोटा करना है?


बेस 64 एनकोड आपके कोड को संपीड़ित नहीं करता है, यह बिल्कुल विपरीत करता है, आप अधिक वर्णों के साथ समाप्त होते हैं। LZ-स्ट्रिंग, तो आप उस का उपयोग कर सकते अपने कोड को संपीड़ित करने के:: आप LZH कम्प्रेस अपने स्ट्रिंग, किसी को एक जे एस स्क्रिप्ट GitHub कि नामित तारों पर LZH संपीड़न करता है पर बनाया जा सकता है pieroxy.net/blog/pages/lz-string/index.html
बेलिहा

3

मैंने एक छोटी स्क्रिप्ट लिखी है जो आपकी स्क्रिप्ट को छोटा करने के लिए एपीआई कहती है, इसे देखें:

#!/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

मुझे हाल ही में एक ही कार्य करने की आवश्यकता थी। जबकि जावास्क्रिप्ट कंप्रेसररिट पर सूचीबद्ध कंप्रेशर्स एक बहुत अच्छा काम करते हैं और उपकरण बहुत उपयोगी है, कंप्रेशर्स कुछ jQuery कोड के साथ अच्छा नहीं खेल रहे हैं जो मैं उपयोग कर रहा हूं ($ .getScript और jQuery.fn चेक)। यहां तक ​​कि Google बंद करने वाला कंप्रेसर भी उसी तर्ज पर चोक हुआ। जबकि मैं अंततः किंक को बाहर निकाल सकता था, यह लगातार करने के लिए बहुत ज्यादा स्क्विंटिंग था।

अंत में बिना किसी समस्या के काम करने वाला UglifyJS (धन्यवाद @ मेष 51 ) था, और संपीड़न केवल अन्य सभी की तुलना में थोड़ा कम था। और Google के समान ही इसमें HTTP API है। पैकर भी अच्छा है और पर्ल, पीएचपी और .NET में भाषा कार्यान्वयन है।


1

वर्तमान में आपके कोड को छोटा करने के 2 तरीके हैं:

  1. आप अपने आवेदन के बैकेंड पक्ष पर मिनिफ़ायर लागू करते हैं - यहाँ लाभ यह है कि आप वर्जनिंग को लागू कर सकते हैं और आपके कोड के नियंत्रण में अधिक हैं - आप व्यावहारिक रूप से पूरी तरह से minification की प्रक्रिया को स्वचालित कर सकते हैं और सबसे अच्छा अभ्यास यह होगा कि आप अपने कोड से पहले इसे लागू करें। सर्वर पर अपलोड किया गया - यह तब सबसे अच्छा उपयोग किया जाता है जब आपके पास बहुत सी सीमा होती है (छोटा होने के लिए) जावास्क्रिप्ट और सीएसएस कोड:

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

इस तरह के कई उपकरण नोड और एनपीएम के लिए भी उपलब्ध हैं - यह ग्रंट के साथ जावास्क्रिप्ट के mnification को स्वचालित करने के लिए अच्छा अभ्यास है।

  1. आप ऑनलाइन चल रहे खनन के लिए कुछ मौजूदा मुफ्त टूल का उपयोग कर सकते हैं - ये व्यावहारिक रूप से आपको ऐसा करने की अनुमति देते हैं, लेकिन मैन्युअल रूप से। मैं आपको सलाह दूंगा कि जब आपकी जावास्क्रिप्ट / सीएसएस कोड की मात्रा छोटी हो - तो बहुत सी फाइलें नहीं

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


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.