如何告诉Closure Compiler不要使用SIMPLE_OPTIMIZATIONS重命名内部函数?

时间:2012-02-28 10:46:51

标签: google-closure-compiler

如何告诉Closure Compiler不要重命名内部函数?例如,鉴于此代码:

function aMeaninglessName() {
    function someMeaningfulName() {
    }

    return someMeaningfulName;
}

...我很好用Closure重命名外部函数(我主动想要它,以节省空间),但我希望单独保留函数名someMeaningfulName(以便调用堆栈中显示的名称)因为它是“someMeaningfulName”,而不是“a”或其他什么)。尽管调用它的代码将通过工厂函数返回的引用而不是代码中的名称来执行此操作。例如,这纯粹是为了调试支持。

请注意,我希望该函数具有 实际名称 ,不是匿名的,并使用该名称分配给某个属性,因此例如这不是重复的this other question

这个有点模糊的用例似乎没有被外部或导出功能所涵盖。 (我有点希望有一些annotation我可以投入它。)但我不是封闭编译器的大师,我希望你们中的一些人。当然,如果没有办法做到这一点,这是一个可以接受的答案。


(用例是一个库,它创建函数以响应对它的调用。我想提供一个由Closure用SIMPLE_OPTIMIZATIONS预压缩的库版本,但是如果有人正在使用该库的副本他们自己的未压缩代码和单步执行调试器[或其他类似操作]中的函数,我希望他们看到有意义的名称。我可以使用eval解决它,或手动编辑压缩结果[in事实上,上下文是足够独特的,我可以在它上面放一个sed脚本,但这很尴尬,坦率地将我们带入“不值得打扰”的领域,因此寻找一种简单,低维护的方式。)

2 个答案:

答案 0 :(得分:1)

没有简单的方法可以做到这一点。您必须创建CodingConvention类的自定义子类,以指示您的方法是" local" externs(为了处理Prototype库而添加了对此的支持)。 InlineVariables,InlineFunctions或RemoveUsedVariables可能仍会尝试删除名称,也需要修复。

另一种方法是使用源映射将堆栈跟踪重新映射到原始源。

答案 1 :(得分:0)

阅读以下部分

https://developers.google.com/closure/compiler/docs/api-tutorial3#export

基本上有两个选项,使用object ['functionName'] = obj.functionName或更好的方法 在goog对象上使用exportSymbol和exportProperty,这是该文档的链接

http://closure-library.googlecode.com/svn/docs/closure_goog_base.js.html

- 编辑 啊,我现在看到了,我的第一个答案对你来说并不是那么好。编译器有一些有趣的标志,你可能感兴趣的是DEBUG,它可以将变量传递给编译器,这将允许你在通过日志记录中删除一些调试注释,或者只是一个字符串,因为你使用的是简单模式,它什么都不做。

因此,如果您使用闭包,则可以针对开发版本进行调试,该开发版本只是构建了已解决依赖性的页面。我们还在代码中删除以下内容

if(DEBUG){
  logger.info('pack.age.info.prototype.func');
}