Javascript 使用闭包编译器时,导出库方法的最佳方法是什么?
闭包编译器文档明确指出:“不要使用外部程序而不是导出”。由于Externs非常方便使用,我遇到了一个问题:Javascript 使用闭包编译器时,导出库方法的最佳方法是什么?,javascript,google-closure-compiler,Javascript,Google Closure Compiler,闭包编译器文档明确指出:“不要使用外部程序而不是导出”。由于Externs非常方便使用,我遇到了一个问题: function Lib(){ //some initialization } Lib.prototype = { invoke : function(str){ //this function is called from outside to invoke some of Lib's events } } 将闭包编译器与高级优化一起使用时,函数调用将从
function Lib(){
//some initialization
}
Lib.prototype = {
invoke : function(str){
//this function is called from outside to invoke some of Lib's events
}
}
将闭包编译器与高级优化一起使用时,函数调用将从源代码中删除。这可以通过两种方式防止:
在原型定义后添加行:
Lib.prototype['invoke'] = Lib.prototype.invoke;
但这在输出代码的末尾添加了一个丑陋的代码和平:
Lib.prototype.invoke = Lib.prototype.g;
我通过将这一行添加到构造函数中,成功地解决了这一问题:
this.invoke = this.invoke;
这一行指向externs文件:
/**
* @param {String} str
*/
Lib.prototype.invoke = function(str){};
这样,闭包编译器就不能从输出代码中删除invoke函数,因为它是在构造函数中自己分配的,也不能重命名它,因为它是在externs文件中定义的。
所以witch方法更好?如果您一致使用JSDoc,您可以使用: 并使用
--generate\u exports
标志调用编译器
这要求您要么从Google闭包库中包含,要么将
goog.exportSymbol
和goog.exportProperty
复制到您的代码库中。我个人喜欢在externs文件中定义接口,并让我的内部类实现它们
// Externs
/** @interface */
function IInvoke {};
IInvoke.prototype.invoke;
/**
* @constructor
* @implements {IInvoke}
*/
function Lib(){
//some initialization
}
Lib.prototype = {
invoke : function(str){
//this function is called from outside to invoke some of Lib's events
}
}
您仍然可以导出构造函数本身,但不能导出接口方法。这可以在没有
@export
标记的情况下完成:Lib.prototype['invoke']=function(str){}代码>使用export
标记仍将重命名该方法,并且短名称在内部使用。这似乎是一种更干净的方法,可以充分利用编译器的潜力,并且更具描述性。同意,但是您建议的使用export
标记的方法涉及goog
命名空间,因此该库不能单独使用。正如我所说,您可以将这两种方法添加到您的代码库中(复制和粘贴)。样式指南中也介绍了这一点。除此之外,编译后的库始终可以独立使用,因为所有依赖项都添加到一个文件中。
// Externs
/** @interface */
function IInvoke {};
IInvoke.prototype.invoke;
/**
* @constructor
* @implements {IInvoke}
*/
function Lib(){
//some initialization
}
Lib.prototype = {
invoke : function(str){
//this function is called from outside to invoke some of Lib's events
}
}