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.