Изменение того, как компилятор Closure называет частные члены

Я работаю с большой JS-библиотекой, минимизированной с помощью ADVANCED_OPTIMIZATIONS, и я хочу изменить способ переименования членов.

Вот что у меня есть на входе:

/**
 * This is my class
 * @constructor
 * @param {string} name
 * */
function MyClass(name) {
    /**
     * I want this public member to stay the same in the output since it will be exported
     * @expose
     * */
    this.exposedMember = name;
    /**
     * But this member is meant to only be used by this class
     * @private
     * */
    this.privateMember = "private";
}
var myObj = new MyClass("Jack");
myObj.exposedMember;    // => "Jack"
myObj.privateMember;    // => "private"

Вот что я получаю на выходе:

var myObj = new MyClass("Jack");
myObj.exposedMember;    // => "Jack"
myObj.Rc;               // => "private"

Вот что я хочу на выходе:

var myObj = new MyClass("Jack");
myObj.exposedMember;    // => "Jack"
myObj._Rc;              // => "private"

Причина в том, что я также работаю с Google Maps JS API, и у меня было несколько случаев, когда мои личные члены конфликтовали со своими при переходе от одной версии к другой. Наличие контроля над моими собственными приватными членами, где я могу выбрать префикс _ (или $, или что-то еще), устранит проблему.

Есть ли что-то в командной строке, что может помочь мне сделать это? Если нет, есть ли плагин для Closure Compiler, который может это сделать? Что-то другое?

Спасибо


person Alex Lein    schedule 14.12.2018    source источник


Ответы (1)


Параметры для управления этим типом переименования не отображаются через флаги командной строки. Это потребует пользовательской сборки компилятора.

В общем, всегда опасно добавлять свойства к внешним объектам, если не известно их полное определение. Google Maps API особенно сложен в этом отношении.

Единственный безопасный способ сделать это — определить собственный внешний вид для расширяемых объектов Maps:

внешний:

/** @const */ google.maps.Marker.prototype.data = {};

источник:

const myMarker = new google.maps.Marker();
myMarker.data.mySafeProperty = 'foo';

Однако это не работает с истинным расширением класса. Это никогда не будет безопасно, если вы не знаете полную подпись типа.

person Chad Killingsworth    schedule 14.12.2018
comment
Вы случайно не знаете, где в Closure мне нужно изменить, чтобы переопределить схему именования закрытых членов Closure, не так ли? - person Alex Lein; 17.12.2018