使Closure编译器条带日志功能使用

时间:2012-03-21 00:46:25

标签: javascript google-closure-compiler



我有一个日志API我想要暴露给一些内部JS代码。我希望能够使用此API进行记录,但仅限于我进行调试构建时。现在,我有部分工作。它只记录调试版本,但是当有常规版本时,对此API的调用仍然在代码中。当我使用goog.DEBUG = false进行编译时,我希望闭包编译器删除这个基本上死的代码。

日志定义:

goog.provide('com.foo.android.Log');
com.foo.Log.e = function(message){
    goog.DEBUG && AndroidLog.e(message);
}
goog.export(com.foo.Log, "e", com.foo.Log.e);

AndroidLog是一个提供给webview的Java对象,它将在这里运行,并且可以像这样正确地解除:

var AndroidLog = {};

/**
 * Log out to the error console
 * 
 * @param {string} message The message to log
 */
AndroidLog.e = function(message) {};

然后,在我的代码中,我可以使用:

com.foo.Log.e("Hello!"); // I want these stripped in production builds

我的问题是:我如何提供此API,在我的代码中使用此API,但是在未使用goog.DEBUG = true编译时,是否删除了对此API的任何调用?现在,我的代码库变得臃肿,一堆从未调用的Log API调用。我想删除。

谢谢!

4 个答案:

答案 0 :(得分:1)

Closure Compiler在CompilerOptions.java中提供了四个选项来剥离代码:1)stripTypes,2)stripNameSuffixes,3)stripNamePrefixes和4)stripTypePrefixes 。 Closure构建工具 plovr ,通过其JSON configuration file options stripNameSuffixesstripTypePrefixes公开name-suffixes-to-striptype-prefixes-to-strip

这些选项如何在第442页到第444页的 Closure:The Definitive Guide 中有很好的例子。以下几行作为常见用例提供:

options.stripTypePrefixes = ImmutableSet.of(“goog.debug”, “goog.asserts”);
options.stripNameSuffixes = ImmutableSet.of(“logger”, “logger_”); 

要了解这些选项的细微差别并避免潜在的陷阱,我强烈建议您阅读 Closure:The Definitive Guide 中的完整示例。

答案 1 :(得分:0)

而不是像jfriend00建议的那样运行你自己的脚本我会看看编译器的define api(也就是goog.DEBUG来自的地方),默认你有DEBUG,COMPILED,但是你可以自己滚动

答案 2 :(得分:0)

好的,事实证明,如果我停止导出com.foo.Log()及其方法,这很容易做到。如果我真的想要能够登录某些特定情况,但仍然在我的内部代码中删除日志调用,我可以为此声明两个类:

// This will get inlined and stripped, since its not exported.
goog.provide('com.foo.android.Log');
com.foo.Log.e = function(message){
    goog.DEBUG && AndroidLog.e(message);
}
// Don't export.


// This be available to use after closure compiler runs, since it's exported.
goog.provide('com.foo.android.production.Log');
goog.exportSymbol("ProductionLog", com.foo.android.production.Log);
com.foo.android.production.Log.log = function(message){
    goog.DEBUG && AndroidLog.e(message);
}
// Export.
goog.exportProperty(com.foo.android.production.Log, "log", com.foo.android.production.Log.log);

答案 3 :(得分:0)

我修改了编译器并将其打包为npm包。

您可以在此处获取:https://github.com/thanpolas/superstartup-closure-compiler#readme

它将在编译期间删除所有日志消息