我想编译一个提供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的接口。
找到了可能的解决方案
console.log(node['getMagic']() || node.getMagic())
这可以确保如果节点被扭曲并且在sdk内,则将调用node.getMagic();如果节点在sdk之外,则将调用node'getMagic'。
这是我应该做的吗?
以上方法有效,直到我尝试使用
扩展和覆盖方法NN.Node = class extends NN.INode {
然后
getMagic() {
super.getMagic()
}
在这种情况下,无法解析正确的getMagic。