我正在研究模块化组件框架,并且在测试环境和生产中对代码有不同的需求。每个组件都有自己的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混乱。我想我可以创建一个新的文件副本,运行查找并替换它们并编译那些文件,但如果我能在闭包编译器中完成所有这些将会很好。
由于
答案 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!