Определить, сжат ли javascript с помощью YIU-компрессора в Javascript - PullRequest
0 голосов
/ 03 августа 2011

Я сделал конструкцию, чтобы отложить загрузку JavaScript для ускорения загрузки страницы.Для развертывания веб-сайтов я использую компрессор YIU для минимизации сценариев, а также для повышения скорости.Там будет две версии сценариев, один сжатый, а оригинальный нет.Например: example-min.js и example.js.Некоторые javascript-скрипты будут загружаться только при входе в функционал, и иногда ему нужно больше скриптов (идея плагина).

В любом случае, я хочу знать (нужны ли другие js-файлы), если js-файл 'host'сжатый, поэтому при сжатии загружается уменьшенная версия файла js.Если нет (при разработке), он загружает оригинальный файл.

Например:

function myObject()
{
var o = this;

o.isJsMinified = function()
{ s =  o.isJsMinified.toString(),ss='s=  '; 
  return (s.indexOf(ss+'o.is')<0);
};

o.require = function( s, delay, baSync, fCallback ) // add script to dom
{
 var oo = document.createElement('script'),
 oHead = document.getElementsByTagName('head')[0],
 f = (typeof fCallback == 'function')?fCallback:function(){};
 if( !oHead )
  { return false; }
 oo.onload = function() {oo.id='loaded'; f(oo); };
 oo.type = 'text/javascript';
 oo.async = (typeof baSync == 'boolean')?baSync:false;
 oo.src = s;
 setTimeout( function() { oHead.appendChild(oo); }, (typeof delay != 'number')?delay:1 );  
 return true;
};

.....
.....

if( <new functionality found> )
{
  if( o.isJsMinified() )
   { o.require('new-min.js',800); }
  else { o.require('new.js',800); }
}

.....
.....

}

Когда вы смотрите на функцию jsIsMinified (), я использую трюк, чтобы определить, работает ли сама функция (источник) вырезан из пробелов (минимизированная версия).Но есть проблема с Firefox, он не возвращает исходное форматирование, поэтому он не может обнаружить никаких различий.

Например: // сжатие компрессором YUI:

o.isJsMinified=function(){s=o.isJsMinified.toString(),ss='s=  ';return (s.indexOf(ss+'o.is')<0);};

Firefox будетdisplay:

function () {
    s = o.isJsMinified.toString(), ss = "s= ";
    return s.indexOf(ss + "o.is") < 0;
}

Функция не работает в Firefox, она всегда «говорит», что она не сжата.Кто-нибудь знает обходной путь для этого?

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Я действительно думаю, что вы здесь все усложняете.Вау, почему бы вам просто не создать две папки на вашем сервере, такие как js/production и js/debug.В ваших файлах javascript может быть один флаг, который может указывать, продуктивен он или нет.Например,

if( window.DEBUG ) {
    o.require('/js/debug/new.js',800);
}
else {
    o.require('/js/production/new.js',800);
}

, если подумать, даже эти папки не нужны.Вы можете просто различить .min или нет.Единственное, что вам действительно нужно сделать, это установить глобальную переменную DEBUG в вашем коде.

0 голосов
/ 03 августа 2011

Заголовки HTTP будут указывать, было ли сжатие запрошено и включено, но нет простого способа прочитать их , поэтому вам может понадобиться специальное расширение Firefox для разработки.

Возможно, это правильное месточтобы внести изменения на сервере, отправьте неминифицированный сценарий, если указан определенный заголовок (и IP-адрес запрашивающего является локальным).

...