如何关闭编译但仍提供未编译“扩展”的接口API

时间:2019-10-19 04:02:18

标签: javascript google-closure-compiler google-closure-library

我想编译一个提供API的“ sdk”。

已编译的文件如何提供未编译的扩展可用于插入已编译的SDK的“接口”?

示例:

API客户端可以在

中包含sdk
<script src='nn-skd'> (nn is the name of the sdk)

这是整个SDK

/**
 * @nocollapse
 * @const
 * @namespace
 */
var NN = {}

/**
 * @interface
 * @export
 */
NN.INode = function() {}
/**
 * @export
 * @return {number} 
 */
NN.INode.prototype.getMagic = function() {}

document.addEventListener("click",()=>{
  const node = /** @type NN.INode */ (window['specialNodeAddedByAPIClientOutsideOfTheSdk'])
  console.log(node.getMagic())
})

我在这里期望的是拥有一个可以将“实现” INode的类放入窗口的客户端['specialNodeAddedByAPIClientOutsideOfTheSdk'],而sdk可以使用此类。

例如,以下未编译的文件:

NN.Node = class {
  getMagic() {
    return 4;
  }
}
window['specialNodeAddedByAPIClientOutsideOfTheSdk'] = new NN.Node();

但这将不起作用,因为Google闭包编译的nn-sdk文件将永远不会调用NN.Node#getMagic。它根本不知道这一点。编译后的文件看起来像

(function() {
    var a = {},
        b = a.a,
        c = ["NN", "INode"],
        d = this;
    c[0] in d || !d.execScript || d.execScript("var " + c[0]);
    for (var e; c.length && (e = c.shift());) c.length || void 0 === b ? d[e] && d[e] !== Object.prototype[e] ? d = d[e] : d = d[e] = {} : d[e] = b;
    a.a.prototype.b = function() {};
    a.a.prototype.getMagic = a.a.prototype.b;
    document.addEventListener("click", function() {
        console.log(void 0)
    });
}).call(window)

console.log()只是'void 0'。

我该如何进行这项工作。编译后的文件如何提供未编译的扩展可用于插入编译后的SDK的接口。

Update1:​​

找到了可能的解决方案

console.log(node['getMagic']() || node.getMagic())

这可以确保如果节点被扭曲并且在sdk内,则将调用node.getMagic();如果节点在sdk之外,则将调用node'getMagic'。

这是我应该做的吗?

更新2和3。

以上方法有效,直到我尝试使用

扩展和覆盖方法
NN.Node = class extends NN.INode {

然后

getMagic() {
super.getMagic()
}

在这种情况下,无法解析正确的getMagic。

0 个答案:

没有答案