![](/img/trans.png)
[英]How to prevent Closure Compiler from renaming “true”, “false” and “null”
[英]Prevent Closure Compiler from renaming properties without using bracket notation
我正在开发一种需要有条件地向最终用户公开API的产品。 我们正在使用Closure Compiler进行压缩。 我要公开的API部分是一个函数,该函数调用带有Result
的回调,该Result
的值是具有某些属性的对象。
具体来说,我要公开的功能看起来像这样(伪jsdoc表示法):
/**
* @type DocumentRenderResult {status: String, image?: HTMLImageElement|HTMLCanvasElement}
* @param {function(Result<DocumentRenderResult>)} callback
**/
function renderDocument (url, page, callback) {
}
Result
类如下所示:
/**
* @template T
* @param {Boolean} ok
* @param {T} val
* @param {Error} err
**/
function Result (ok, val, err) {
this.ok = ok;
this.val = val;
this.err = err;
}
我想要公开两个Result
对象API-也就是说,存在ok
, val
和err
属性,并公开renderDocument
接口,以便提供回调的用户将能够访问status
和image
属性。
一种解决方案(可能)是在所有地方都使用括号表示法,但是由于应该仅在有条件的情况下 (对于某些最终用户)使用方括号表示法,因此我想将是否缩小的概念与代码分开。
我认为@implements和@export的某种组合以及一个externs文件可以完成此操作,但是我还没有弄清楚。
我想做的事可能吗?
有两种主要方法可以处理这种情况:
将所有导出存储在单独的文件中,该文件成为api公开库的主要入口点。 这种方法不依赖外部库。 有关此示例,请参见我的GeolocationMarker库 。
如果您愿意在项目中使用很小一部分的闭包库代码,则可以使用@export
批注。 @export
注释不执行任何操作,除非指定了编译标志--generate_exports
。
使用--generate_exports
,编译器会将相应的调用添加到闭包库的goog.exportProperty或goog.exportSymbol方法中。
/** @const */
var mynamespace = {};
/** @export */
mynamespace.maybeExposedMethod = function() {};
使用--generate_exports
标志,编译器将生成代码:
var mynamespace = {maybeExposedMethod:function() {}};
goog.exportSymbol("mynamespace.maybeExposedMethod",
mynamespace.maybeExposedMethod);
不必依赖于所有的关闭库。 您可以将这两种方法的定义复制到源代码中。 所需要的就是它们以这些名称的形式存在。
返回匿名对象的函数必须区别对待以防止重命名。 最好的选择是在其自己的文件中定义记录类型。 为使公共api阻止重命名,请将记录定义包括在内。 当您想要重命名记录属性时,请将该定义包括为源。
my_typedefs.js
/** @typedef {{image: string, status: number}} */
var my_record_type;
my_method_def.js
/** @return {my_record_type} */
function my_method() {
return {
image: 'some_image.jpg',
status: 200
};
}
如果my_typedefs.js
包含在带有--js
标志的编译中,则记录属性将被重命名,但是如果它包含在--externs
标志中,则它们将不被重命名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.