我理解使用JavaScript使用源映射的概念,可以使用缩小的脚本等来简化调试。我没有得到的是源代码级调试的工作方式与Visual Studio中的TypeScript类似(http://blogs.msdn.com/b/typescript/archive/2012/11/15/announcing-typescript-0-8-1.aspx )。
例如,如果我创建自己编译/转换为JavaScript的语言,我如何与浏览器交互以提供这种源级调试?这是否有标准协议? Visual Studio如何做到这一点?
更新
为了澄清更多,我们假设我发明了一种名为Caffeinated Beverage Script的语言,它编译成JavaScript。我为我的语言构建了一个IDE,我希望能够在JavaScript中运行浏览器时在IDE中设置断点,逐步执行代码,检查变量等。如何让我的IDE与此级别的浏览器进行通信?
答案 0 :(得分:1)
这无疑是一个糟糕的答案,但我认为它总比没有好。如果我在你的鞋子里,我会这样做:
现在很明显可以使用某种插件从浏览器与IDE进行通信,但至少有两个原因我不喜欢它:我不喜欢强类型语言编码,任何代码我产品将具有固有的浏览器特定性。虽然它不是最轻的重量解决方案,但是在阻塞模式下的XHR可以完成工作。
IDE将托管发送CORS header的http服务器。编译后的源代码包含如下内容:
var ___, __INTERRUPT_SIGNAL = {};
(function() {
var oXhr = new XMLHttpRequest();
oXhr.open('POST', 'http://localhost/debugging_port', false); // Force XHR to work synchronously
___ = function(nLineNumber) {
var sState = 'line_number='+nLineNumber;
for(var nOffset = 0; nOffset < arguments.length; nOffset++) sState += '&i=' + escape(arguments[nOffset]);
oXhr.send(sState);
if(oXhr.status !== 200) return ___.apply(this, arguments);
var sCommand = oXhr.responseText;
if(sCommand === 'step_into') {
return;
}else if(sCommand === 'step_out') {
throw __INTERRUPT_SIGNAL;
}else{
return ___.apply(this, arguments);
}
};
})();
现在,当Caffeinated Beverage Script编译器编译源代码时,它应该在源的每个换行符处调用 _ 函数。例如,
int nCheese = 0;
char cLetter = 'Q';
customClass productZeroQ = nCheese * cLetter;
可能会编译为类似
的内容var $0xA1, $0xA2, $0xA3;
___(9, $0xA1, $0xA2, $0xA3);
$0xA1 = 0;
___(10, $0xA1, $0xA2, $0xA3);
$0xA2 = 'Q';
___(11, $0xA1, $0xA2, $0xA3);
try {
$0xA3 = $0x34.$0x21($0xA1, $0xA2);
}catch(oSignal){
if(oSignal !== ___INTERRUPT_SIGNAL) throw oSignal;
}
当IDE决定是step_out还是step_forward时,XHR将阻止执行。这可以扩展到包括堆栈跟踪,但我不想写一本小说。
我知道这很难看,但我希望这有点帮助!
答案 1 :(得分:1)
您可能会考虑使用WebKit的远程调试API:
https://developers.google.com/chrome-developer-tools/docs/protocol/1.0/index
我相信这是Sublime Web Inspector使用的。