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

Sky*_*sey 12 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);
Run Code Online (Sandbox Code Playgroud)

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

var AndroidLog = {};

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

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

com.foo.Log.e("Hello!"); // I want these stripped in production builds
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Sky*_*sey 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);
Run Code Online (Sandbox Code Playgroud)