繁体   English   中英

不使用括号表示法防止Closure Compiler重命名属性

[英]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-也就是说,存在okvalerr属性,并公开renderDocument接口,以便提供回调的用户将能够访问statusimage属性。

一种解决方案(可能)是在所有地方都使用括号表示法,但是由于应该仅在有条件的情况下 (对于某些最终用户)使用方括号表示法,因此我想将是否缩小的概念与代码分开。

我认为@implements和@export的某种组合以及一个externs文件可以完成此操作,但是我还没有弄清楚。

我想做的事可能吗?

有两种主要方法可以处理这种情况:

没有关闭库

将所有导出存储在单独的文件中,该文件成为api公开库的主要入口点。 这种方法不依赖外部库。 有关此示例,请参见我的GeolocationMarker库

使用Closure-Library(或至少一部分)

如果您愿意在项目中使用很小一部分的闭包库代码,则可以使用@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM