我有一个日志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调用。我想删除。
谢谢!
答案 0 :(得分:1)
Closure Compiler在CompilerOptions.java中提供了四个选项来剥离代码:1)stripTypes
,2)stripNameSuffixes
,3)stripNamePrefixes
和4)stripTypePrefixes
。 Closure构建工具 plovr ,通过其JSON configuration file options stripNameSuffixes
和stripTypePrefixes
公开name-suffixes-to-strip
和type-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
它将在编译期间删除所有日志消息