Почему компиляция Google Closure не хранит повторно используемые индексы в переменных? - PullRequest
0 голосов
/ 21 мая 2018

Этот MWE показывает, как компилятор Google Closure заменяет короткий obj[keyA] на более длинный obj["some-very-long-key"]:

Входной JavaScript:

var foo = new function() {
  var keyA = 'some-very-long-key';
  var keyB = 'another-key';
  this.bar = function() {
    obj[keyA] = {};
  }
  this.baz = function(data) {
    obj[keyA][keyB] = data;
  }
}();

Google Closureвывод компилятора:

var foo = new function() {
  this.bar = function() {
    obj["some-very-long-key"] = {};
  };
  this.baz = function(a) {
    obj["some-very-long-key"]["another-key"] = a;
  };
};

Если я удалю функцию обтекания, будет работать так, как я ожидал, до :

Входной JavaScript:

var keyA = 'some-very-long-key';
var keyB = 'another-key';
function bar() {
  obj[keyA] = {};
}
function baz(data) {
  obj[keyA][keyB] = data;
}

Вывод компилятора Google Closure:

var keyA = "some-very-long-key", keyB = "another-key";
function bar() {
  obj[keyA] = {};
}
function baz(a) {
  obj[keyA][keyB] = a;
}
;

Поскольку я часто использую длинный ключ в своем проекте, код становится больше, чем мог бы быть, если компилятор Google Closure сохранил строковый литералв переменной.

  • Что вызывает такое поведение?
  • Как мне получить строковый литерал для хранения внутри переменной и использовать эту переменную (которая имеет более короткое имя) в качестве индекса, сохраняя все это внутри конструктора?

Обновление 1: Я знаю, что мой требуемый результат мог бы быть немного хуже, но я бы предпочел взятьгораздо более короткий код.

1 Ответ

0 голосов
/ 22 мая 2018

Из-за gzip - обычно делает сжатый размер меньше.Это даже в FAQ

...