是否可以使用谷歌闭包编译器改变JavaScript?

时间:2012-02-03 18:55:42

标签: javascript google-closure-compiler

我正在研究模块化组件框架,并且在测试环境和生产中对代码有不同的需求。每个组件都有自己的js文件,这些文件正在一起编译以供生产使用,但在我的开发环境中保持独立。

在生产中,我想在初始化的各个阶段捕获错误,以免破坏调用堆栈。在我的开发(未压缩的javascript)中,我不想捕获错误,因此我可以快速获取行号等,以找到中断发生的位置。是否有任何方法可以使用闭包编译器来操作javascript文件(例如删除标记行,例如注释开头和更近),这可能允许我这样做?

例如:

proto.instantiateChildFromDescriptor = function(childObj, callback, customDiv){
/*ProductionErrorTrap
    try{
/**/
    //code for instantiating a module
/*ProductionErrorTrap
    }catch(e){
        console.log("problem instantiating child in " + this.getName());
        console.error(e);
    }
/**/
}

/*ProductionErrorTrap替换为/*ProductionErrorTrap*/可以很好地工作(所以在第二个评论区删除我的星星,但它们就在那里)

我无法通过查找和替换文件本身来执行此操作,因为它会与github混乱。我想我可以创建一个新的文件副本,运行查找并替换它们并编译那些文件,但如果我能在闭包编译器中完成所有这些将会很好。

由于

3 个答案:

答案 0 :(得分:1)

使用编译器标志进行高级模式。

自:
https://developers.google.com/closure/compiler/docs/js-for-compiler

@define {Type} description

例如:

/** @define {boolean} */
var ENABLE_DEBUG = true;

/** @define {boolean} */
goog.userAgent.ASSUME_IE = false;

表示编译器在编译时可以覆盖的常量。通过上面的示例,您可以将标记--define='ENABLE_DEBUG=false'传递给编译器,以将ENABLE_DEBUG的值更改为false

答案 1 :(得分:1)

我认为搞乱编译结果,匹配注释来模拟ifdef是非常不优雅的。

你实际上可以这样做:

debugTry(function() {
    alert('This is code that might cause an error');
},function(e) {
    alert('Whoops! Caught error '+e);
});

然后在调试时执行:

function debugTry(test,handle) {
    try {
        test();
    } catch(e) {
        handle(e);
    }
}

在制作中:

function debugTry(test,handle) {
    test();
}

Closure Compiler很聪明。使用第一个debugTry,示例编译为:

try{alert("This is code that might cause an error")}
catch(a){alert("Whoops! Caught error "+a)};

使用第二次debugTry,它编译为:

alert("This is code that might cause an error");

如您所见,检测并消除了不必要的代码。

当然,如果您没有有条件地包含try块,事情会更容易。如果只是有条件地包含一些语句,而不是改变其他代码的结构,你可以这样做:

/** @const */ var debug = false;

if(debug) {
    alert('Yay for debugging!');
}

警报将被编译掉。

答案 2 :(得分:0)

Stephen Chung的评论似乎是最好的方法。对于有这个问题的其他人,将他的评论添加为此问题的答案。我在我的代码中输入以下内容

 proto.updateProperties = function(propsObj){
 /** @preserve ProductionErrorTrap try{ /**/
    //do stuff here
 /** @preserve ProductionErrorTrap }catch(e){console.log("problem updating properties in " + this.getName());console.error(e);}/**/
 }

压缩javascript之后我只是在压缩文件上运行查找和替换,删除换行符并用ProductionErrorTrap替换ProductionErrorTrap * /并且所有内容似乎都工作正常而不会使存储库混乱。

谢谢Stephen!