更改Closure编译器命名私有成员的方式

时间:2018-12-14 20:02:09

标签: google-closure-compiler

我正在使用一个大型的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插件可以做到这一点?还有吗?

谢谢

1 个答案:

答案 0 :(得分:0)

用于引导这种类型的重命名的选项不会通过命令行标志公开。这将需要自定义编译器版本。

通常,向外部对象添加属性总是很危险的,除非知道它们的完整定义。 Google Maps API在这方面特别棘手。

唯一安全的方法是为要扩展的Maps对象定义自定义外部元素:

外部:

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

来源:

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

但是,这会因真正的类扩展而破裂。不知道完整的类型签名绝对是不安全的。