Google Closure Compiler не переименовывает некоторые свойства

Было задокументировано, что компилятор Google Closure, использующий расширенную оптимизацию, переименует некоторые свойства, но не другие. Однако, похоже, нет объяснения, почему не удается переименовать свойства "id" и "visibility" в следующем коде:

const model = {
    age: 5,
    id: 1234,
    visibility: true,
    skills: 4,
    hair: 667
}


function doSomething() {
    var s = Object.create(model);
    console.log("Age: " + model.age);

    s.visibility = "john";
    s.age = 2;
    s.skills = 5;
    s.hair = 999;

    model.age = 6;
    return s;
}

doSomething();

И это настройки компилятора:

java -jar closure-compiler/compiler.jar \
    --compilation_level ADVANCED_OPTIMIZATIONS \
    --js_output_file scripts/release/test-min.js \
    --warning_level VERBOSE \
    --language_out ECMASCRIPT5 \
    --language_in=ES6_Strict \
    --js scripts/temp/test.js

Вы заметите, что нет внешних.

1 ответ

Решение

Closure-compiler будет переименовывать элементы только в том случае, если он считает, что может это сделать безопасно. Существует два типа свойств, которые можно переименовать:

  • Имена свойств, которых нет ни в одном внешнем объекте
  • Свойства, в которых у компилятора достаточно информации о типе для переименования, даже если свойство существует для внешнего объекта.

id а также visibility оба существуют как свойства во внешних объектах по умолчанию. Поэтому они не могут быть переименованы, если недостаточно информации о типе.

Если какой-либо объект имеет неизвестный тип и имеет свойство с тем же именем, переименование на основе типа не будет переименовывать его. Это неизвестное свойство может даже быть в externs по умолчанию.

Компилятор намного лучше переименовывает реальные классы, чем анонимные объекты. Вы можете попытаться увидеть, что произойдет, если вы сделаете model и фактический класс.

Другие вопросы по тегам