Xpoint
   [напомнить пароль]

Ищу PHP Скрипт или RegEx для чистки/сжатия javascript'ов

Метки: [без меток]
2006-03-29 05:00:42 [обр] Василий Свиридов(0/175)[досье]
Разработал сайт, который подключает большое количество .js файлов. Работает замечательно, но проблема возникла весьма специфическая. Хостер - в Малайзии, и latency до их серверов идиотически высок при нормальной пропускной способности. Сайт грузится дико медленно (каждый скрипт добавляет по секунде) и заказчика это бесит. Написал PHP скрипт, который собирает все необходимые яваскрипты, и вставляет их непосредственно в HTML перед отправкой. Все скрипты оказываются встроенны непосредственно в HTML файл, но хочется поубирать из них все лишние пробелы, табы, желательно чтобы все скрипты стали "в одну строчку". То что написал сам (пара str_replace'ов) делает их нерабочими, т.к. сбивает синтаксис.
спустя 24 минуты [обр] Роман Чемисов(0/327)[досье]
Василий Свиридов[досье]
Не совсем то, что Вам нужно, но... The JavaScript Minifier
спустя 3 минуты [обр] Роман Чемисов(0/327)[досье]
Василий Свиридов[досье]
Вот ещё нашёл (это уже больше по теме): A JavaScript compressor in Perl
спустя 5 часов [обр] Василий Свиридов(0/175)[досье]
Роман Чемисов[досье]Спасибо, думаю модифицировать для PHP не составит труда.
спустя 3 часа 4 минуты [обр] Даниэль Алиевский(0/125)[досье]

Посмотрел "A JavaScript compressor in Perl". Проверил. Как я и думал, следующий JavaScript испортился:

var a = " 11111  a = b 11222 ";
a = a.replace(/a = b/g,"");
alert(a);

Оно "не понимает", что /.../ в JavaScript с некоторых пор является строкой (регулярным выражением). И выдает мне /a=b/g, что, конечно, приведет к неправильной работе. А поскольку отличить такую конструкцию от обычных знаков деления с помощью regexp, похоже, невозможно (тут нужен полноценный транслятор), то и вся затея немногого стоит. Пробелы вокруг идентификаторов удалить нельзя, комментарии стиля /*...*/ тоже нельзя (ибо /.*/ - не признак конца комментария). Не уверен насчет //-комментариев - их, может быть, и можно удалить. Ну и заменить \r\n на \n. Но это сущие копейки. В свое время я столкнулся с этой проблемой при сжатии скриптов WebWarper.

Главное, даже полная (некорректная) оптимизация, приведенная по ссылке - экономия на спичках. Разве что скрипт наполовину состоит из комментариев. Почему бы не использовать gzip?

спустя 1 час 58 минут [обр] Роман Чемисов(0/327)[досье]
Даниэль Алиевский[досье]
Абсолютно с Вами согласен. Но, видимо, у автора темы другое мнение.
спустя 1 час 41 минуту [обр] Даниэль Алиевский(0/125)[досье]

Роман Чемисов[досье] Конечно, если автор сам создал все JavaScript-ы, он может просто не использовать конструкцию /.../ для регулярных выражений. Я, скажем, ее обычно избегаю (чтобы не получать сообщений о серьезной ошибке синтаксиса в старых броузерах), использую более громоздкий new RegExp. Но в любом случае игра вряд ли стоит свеч.

Василий Свиридов[досье] Кстати, если ваш хостер не позволяет включить общий gzip для сайта, и вы не можете использовать для gzip-ования PHP, то всегда есть примитивное решение, работающее в любом Apache для отдельно взятого файла. Gzip-уете файл, даете gzip-версии расширение .gz и выкладываете. Поймет почти любой броузер. Apache сам распакует, если броузер не понимает gzip. Скорее всего, удастся настроить и для другого расширения через .htaccess: директива AddEncoding gzip .gz Заодно можете проверить - вдруг через WebWarper скорость получается лучше (хотя вряд ли :))

спустя 5 часов [обр] Василий Свиридов(0/175)[досье]

Роман Чемисов[досье]
Даниэль Алиевский[досье]

Спасибо за советы, наверное это не такая уж и хорошая идея. Наверное по достижении полной готовности я их пожму каким-нибудь обфускатором полноценным.

спустя 6 месяцев [обр] Никита Козин (Wonder)[досье]
спустя 10 часов [обр] Василий Свиридов(0/175)[досье]
Никита Козин (Wonder)[досье]
К сожалению после него тоже перестаёт работать.
спустя 1 год 11 месяцев [обр] Алексей[досье]

Здравствуйте. Сначала кратко: вот ссылка где можно взять стабильный компрессор:
http://www.russkiy-rim.ru/public/soft/jscompressor.html

Вот пример кода, который сжимается неправильно простым online-компрессором

if(boolean)var varname=smth
else if (boolean) ..

Короче не понравилось мне это и я написал свой собственный компрессор. В нем удалось избежать многих проблем. Единственное, действительно - прога будет портить код при регулярных выражениях вида /a = b/g (ну без кавычек). Но все же более стабильная чем большинство онлайн-компрессоров. Не удивляйтесь - сайт, на котором лежит дистрибутив посвящен наружной рекламе (хочу помочь другу набрать посетителей)

спустя 1 день 11 часов [обр] Алексей[досье]
Друзья, смею обрадовать вас. Теперь по той же ссылке доступна новая версия - которая ко всему прочему сжимает локальные переменные и не портит регулярные выражения, записанные без кавычек.
Я тестировал программу на довольно больших кусках кода. Но вот маленький примерчик, с которым она легко справляется:
function test() {
   var varOut/*a*/ = "opa";
   function testIn(param) {
      var str = varOut+"2, param: "+param;
      return str.replace(/ p/i, '');
   }
   alert(testIn("!"));
}
спустя 17 дней [обр] Даниэль Алиевский(0/125)[досье]

На всякий случай (некогда проверять) - а с таким она справится?

function test() {
   var varOut/*a*/ = "o\/a";
   function testIn(param) {
      var str = varOut+"2, param: "+param;
      return str.replace(/\//i, '');
   }
   alert(testIn("!"));
}

Не сочтет пару // за начало комментария? Regexp-ы в JavaScript-е - противная вещь, они вне кавычек, а встретиться внутри может почти все что угодно.

Powered by POEM™ Engine Copyright © 2002-2005