簡體   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