Javascript 如何关闭编译,但仍向未编译的';扩展';
我想编译一个提供API的“sdk” 一个已编译的文件如何提供一个“接口”,未编译的扩展可以用来插入已编译的SDK 例如: API客户端可以包括带有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
<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()
}