Google closure compiler 如何告诉闭包编译器不要使用简单的优化来重命名内部函数?

Google closure compiler 如何告诉闭包编译器不要使用简单的优化来重命名内部函数?,google-closure-compiler,Google Closure Compiler,如何告诉闭包编译器不要重命名内部函数?例如,给定此代码: function aMeaninglessName() { function someMeaningfulName() { } return someMeaningfulName; } …我可以使用闭包重命名外部函数(为了节省空间,我主动希望它这样做),但我希望函数名someMeaningfulName不受影响(因此在调用堆栈中显示的名称是“someaningfulname”,而不是“a”或其他名称)。尽管调用

如何告诉闭包编译器不要重命名内部函数?例如,给定此代码:

function aMeaninglessName() {
    function someMeaningfulName() {
    }

    return someMeaningfulName;
}
…我可以使用闭包重命名外部函数(为了节省空间,我主动希望它这样做),但我希望函数名
someMeaningfulName
不受影响(因此在调用堆栈中显示的名称是“someaningfulname”,而不是“a”或其他名称)。尽管调用它的代码将通过工厂函数返回的引用(而不是代码中的名称)来执行此操作,但仍然存在这种情况。例如,这纯粹是为了调试支持

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

这个有点模糊的用例似乎既不包含在externs中也不包含在exports功能中。(我有点希望有一些我可以扔给它。)但我不是闭包编译器大师,我希望你们中的一些人是。当然,如果没有办法做到这一点,这是一个可以接受的答案



(用例是一个库,它创建函数以响应对它的调用。我想提供一个库的版本,该版本通过简单的_优化通过闭包进行预压缩,但是如果有人使用库的副本和他们自己的未压缩代码,并在调试器中单步进入函数[或其他类似操作],我希望他们看到有意义的名称。我可以通过
eval
绕过它,或者手动编辑压缩结果[事实上,上下文足够独特,我可以向其抛出
sed
脚本],但这很尴尬,坦率地说,这让我们“不值得麻烦”区域,因此寻找一种简单、低维护的方法。)

阅读以下部分

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

--编辑 啊,我现在明白了,我的第一个答案对你来说不是很好。编译器有一些有趣的标志,你可能会感兴趣的是DEBUG,你可以将变量传递给编译器,让你可以通过日志记录或者仅仅是一个字符串来删除一些调试注释,因为你使用的是simple模式

因此,如果您使用闭包,您可以针对开发版本进行调试,开发版本只是一个解决了依赖关系的页面

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

没有简单的方法可以做到这一点。您必须创建CodingConvention类的自定义子类,以指示您的方法是“本地”外部(添加了对此的支持以处理原型库)。可能InlineVariables、InlineFunctions或RemoveUsedVariables仍将尝试删除名称,并且还需要进行修复


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

以前也有firebug插件,但现在已经不存在了。如果您一般都使用闭包,我们倾向于构建一个只解决依赖项的开发版本(在chrome调试器中,您实际上可以看到整个类路径,而不仅仅是Firebug中的对象)并且在每个函数成员中都有以下类型的行,所以如果我认为值得,我会使用我自己的本地自定义版本的编译器,它有一个
编码约定。代理
来包装默认的编码约定,并覆盖…什么,
isPrivate
使该成员返回
false
(字符串名称,布尔本地)是感兴趣的方法,特别是在“本地”时是真的。谢谢。那么我还必须破解
CommandLineRunner
来添加一个标志?从外观上看,我可能想包装或扩展
ClosureCodingConvention
,而不是默认值,以获得与正常情况相同的行为以及我的特殊功能。总的来说,这并不太糟糕,Closure下载并使用如果我真的有雄心壮志,我可能会添加一个注释,并将其作为补丁提供。我不知道这方面的任何礼仪。我的意思似乎是“如果你觉得这些信息有用,请不要忘记投票”。我还必须黑掉
CommandLineRunner
之类的东西,对吗?