JavaScript минимизация строковых литералов? - PullRequest
4 голосов
/ 21 июля 2010

Я просматривал некоторые из наших JavaScript-сжатий и заметил, что никакие строки, которые не являются именами свойств объекта, не преобразуются в переменные.

Например, допустим, у меня есть эти два фрагмента кода в моем скрипте:

alert("Wrong answer");
alert("Wrong answer buddy");

Минимизация, которую мы получаем из YUI и Closure, если я не ошибаюсь, это:

alert("Wrong answer");alert("Wrong answer buddy");

Я думаю, что в результате минификациябудет выглядеть так:

var a="Wrong answer";alert(a);alert(a+" buddy");

Есть ли какие-нибудь инструменты минимизации для этого?Что мешает нашим инструментам делать это?

Ответы [ 3 ]

8 голосов
/ 21 июля 2010
Сжатие

gzip сократит идентичные строки до байта или двух. Используйте это, и это не проблема. :)

2 голосов
/ 21 июля 2010

Если бы я рискнул предположить, я бы сказал, что это потому, что компилятор не может сказать, когда будет более оптимальным разбить ваши строки на переменные и объединить их.(И, как говорится, в первую очередь это относится к микрооптимизации.)

Например, следующий код:

if (test_case==="He fell down a well") {
    var i=my_object_array.length-1;
    while(i>=0) {
        my_object_array[i].say("He fell down a well did he Lassie?");
        i--;
    }
}

Может быть перерисованвашим теоретическим компилятором как:

var x="He fell down a well";
if (a===x) {
    var i=b.length-1;
    while(i>=0) {
        b[i].say(x+" did he Lassie?");
        i--;
    }
}

... что, конечно, увеличит время, необходимое для выполнения цикла while.

Конечно, немного более интеллектуальный компилятор может распознать эту ловушку и оптимизировать ее еще больше:

var x="He fell down a well";
var x1=x+" did he Lassie?";
if (a===x) {
    var i=b.length-1;
    while(i>=0) {
        b[i].say(x1);
        i--;
    }
}

В любом случае, хороший компилятор javascript, на мой взгляд, оптимизирует код в первую очередь для производительность и только во вторую очередь для подсчета символов.Поскольку это оптимизация в первую очередь для улучшения количества символов, я думаю, что, вероятно, просто не было достаточного спроса на него, чтобы оправдать время людей, которые поддерживают Closure и YUI Compressor.

1 голос
/ 21 июля 2010

У инструментов сжатия есть свои пределы, и вы их нашли.Вы должны создать свои собственные переменные для строк, тогда инструменты будут сжимать имена переменных.

Eg
var msg_wrong = "Wrong answer",
    msg_very_wrong = msg_wrong + "!!!";
alert (msg_wrong);
alert (msg_very_wrong);


// "msg_wrong" and "msg_very_wrong" variable names will be compressed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...