Reducerea unui fisier javascript in Perl

Una dintre regulile legate de performanta site-urilor tine de micosrarea fisierelor javascrips si css incluse in document. Exista cateva unelte foarte bune pentru asta, JSMIN fiind si cea mai buna si mai folosita, pe care o si recomand mai departe. Dar, pentru ca imi place sa experimentez, m-am gandit sa fac propria mea versiune a unui “minificator” javascript, mai ales ca cele existente citesc fisierele caracter cu caracter.

Asadar, folosind Perl si numai expresii regulate am facut un script de cateva randuri care incearca sa reduca marimea unui fisier javascript. Scriptul recunosc ca nu e cel mai bun, in unele cazuri modifica si ceea ce nu trebuie, in special in interiorul unor stringuri (dar nu sunt chestii foarte grave ce pot afecta codul).

use strict;
use warnings;

my ($filename) = @ARGV;
my @trace;
print $filename;
$filename =~ /^(.+)\.js$/;

my $filename_min = $1.".min.js";
open(FM, "> $filename_min") or die "Could not open: $!";

while(<>) {
 chomp;
 s/^\s*//; s/\s*$//; s/\/\/(.+)//;
 if (/\/\*/) { push @trace, 1; s/\/\*(.*)//;}
 if ((@trace > 0)&&(/(.*)\*\//)) { s/(.*)\*\///; pop @trace;}
 else { if (@trace > 0) { s/(.*)//;} }
 s/(?<=[-\$\+\(\)=\:&\?\{\}\]\[\|;<>])\ (?=([\w\d]))//g;
 s/(?<=([\w\d]))\ (?=[-\$\+\(\)=\:&\?\{\}\]\[\|;!<>])//g;
 s/(?<=["'\$\-\+\(\),=\:!&\?\{\}\]\[\|;])\ (?=["'\$\-\+\(\),=\:!&\?\{\}\]\[\|;])//g;

 print FM $_;
}

close(FM) or die "Could not close: $!";

Nu sunt exper in Perl, asa ca e posibil sa nu fie cel mai frumos cod, dar isi face cat de cat treaba. Dar ce face mai exact? Citeste fisierul javascript de la linia de comanda, il deschide, face noul fisier la care ii adauga denumirea .min, si apoi preia rand cu rand continutul din fisierul original. Fiecare rand e curatat de spatiu inutil, comentarii si alte lucruri de acest gen, iar apoi scoate spatiile dintre caracterele - $ + ( ) = : & ? { } ] [ | ; < > si caracterele alfanumerice, precum si spatiile dintre caracterele " ' $ - + ( ) , = : ! & ? { } ] [ | ;.

Nu am facut nicio verficare, pentru ca s-ar presupune ca corect scris codul :D si nu e cazul. Daca cineva crede ca ii e folositor sciptul, foarte bine, daca poate sa il inbunatateasca si mai bine. Dar daca vreti sa curatati fisierele javascript pentru un proiect, mai bine folositi JSMIN.

PS: E misto sa faci un script fie folosind Perl, fie folosind direct JSMIN prin care automat micsorezi toate fisierele js ce le ai intr-un folder, le unesti si voila, nu mai trebuie sa faci asta manual plus ca mai bifezi un punct din lista de Best Practices de la Yahoo Developer Network.

Tags: , ,

7 Responses to “Reducerea unui fisier javascript in Perl”

  1. rgrig 21 January, 2010 at 16:33 #

    vezi si http://code.google.com/closure/compiler/

  2. Daniel 21 January, 2010 at 17:05 #

    Mersi de link, l-am incercat acum si intr-adevar e mult mai eficient decat jsmin. :)

  3. rares 8 June, 2010 at 16:36 #

    mmm! multumesc!

  4. Bianca 16 July, 2010 at 02:50 #

    ce stupid o sa mai sune…dar mi-ar place sa inteleg despre ce vb tu aici :P
    am dat peste blogul tau…si mi-a sarit in ochi “site-uri dragute pentru oameni de treaba :P” cum stabilesti tu cine e de treaba?(din moment ce la pagina cu despre n-ai loc de coment trebuia s ate abordez cumva….chiar de nu sunt in tema scuzeee :) )

  5. Daniel 16 July, 2010 at 12:51 #

    Pai iti dai seama din prima cine e de treaba si cine nu, asta si in sensul in care iti face placere sau nu sa lucrezi cu/pentru cineva. :)

  6. daniel 27 July, 2010 at 08:04 #

    JSMIN e open source … sau tre sa il buy or crack ?

  7. Daniel 20 August, 2010 at 11:24 #

    E gratuit …

Leave a Reply