![](/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.