Javascript 如何关闭编译,但仍向未编译的';扩展';

Javascript 如何关闭编译,但仍向未编译的';扩展';,javascript,google-closure-compiler,google-closure-library,Javascript,Google Closure Compiler,Google Closure Library,我想编译一个提供API的“sdk” 一个已编译的文件如何提供一个“接口”,未编译的扩展可以用来插入已编译的SDK 例如: API客户端可以包括带有 <script src='nn-skd'> (nn is the name of the sdk) 我希望这里有一个客户端,可以将“实现”INode的类放入窗口['SpecialNodeAddedByApiclientToutSideofthesdk'],sdk可以使用这个类 例如,与以下未编译文件类似: NN.Node = class

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

一个已编译的文件如何提供一个“接口”,未编译的扩展可以用来插入已编译的SDK

例如:

API客户端可以包括带有

<script src='nn-skd'> (nn is the name of the sdk)
我希望这里有一个客户端,可以将“实现”INode的类放入窗口['SpecialNodeAddedByApiclientToutSideofthesdk'],sdk可以使用这个类

例如,与以下未编译文件类似:

NN.Node = class {
  getMagic() {
    return 4;
  }
}
window['specialNodeAddedByAPIClientOutsideOfTheSdk'] = new NN.Node();
但这不会起作用,因为google closure编译的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

更新1: 找到了一个可能的解决办法

console.log(node['getMagic']() || node.getMagic())
这可以确保如果节点被损坏并且位于sdk内部,则会调用node.getMagic(),而如果节点位于sdk外部,则会调用节点“getMagic”

这是我应该做的吗

更新2和3。 上述方法一直有效,直到我尝试用

NN.Node = class extends NN.INode {
然后

getMagic() {
super.getMagic()
}

在这种情况下,不可能解析正确的getMagic。

首先,我无法在上复制它(我没有使用它,所以可能弄错了)。其次,
super.getMagic()
将失败,无论您是否编译它。它只是没有
super
这个功能的名称,我不会在这里给你一个完整的答案,因为这里有很多问题和资源来处理外部程序(至少是所有的官方文档)。@Grahampsheath我确实大量使用外部程序,但我看不出它们有什么帮助。外部人员没有给我答案。它们帮助我将代码编译到提供的api。但是我的代码不是用GCC编译的。已编译的sdk和我的代码只是在同一页上执行。@appleapple您是对的,closure-compiler.appspot.com生成的结果与使用命令行编译的结果不同。不知道为什么,但是使用
java-jar{ENV['CLOSURE\u PATH']}--js{PATH}{extraOptions}--编译级高级优化\--输出包装器“(函数(){%output%})。调用(窗口)\--js\u输出文件{result\u PATH}
,输出是完全不同的
getMagic() {
super.getMagic()
}