如何为VS之类的TypeScript语言提供源代码级调试?

时间:2013-07-23 20:11:17

标签: javascript debugging source-maps

我理解使用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与此级别的浏览器进行通信?

2 个答案:

答案 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使用的。

https://github.com/sokolovstas/SublimeWebInspector