假设我有一种类似的语言
print "Hello World"
这是透明的
var $__Helpers = { print: function(s) { if (typeof s != 'string') throw new TypeError('String expected'); console.log(s); } }; $__Helpers.print("Hello World");
如果这种语言的用户是
print 5
TypeError将由$__ Helpers.print抛出,表示“String expected”.我希望开发人员工具显示打印5行作为此错误的始发调用.我知道如何让我的源地图显示一个看起来像一个调用栈
transpiled_script.js:2 original_script.os:1
其中transpiled_script.js:2是调用$__ Helpers.print函数和original_script.os的脚本和行号:1是要打印的调用的脚本和行号5.我想让开发工具忽略最顶层调用transpiled_script.js(这只是我的transpiler的一个实现细节),并且只显示原始脚本的调用(这是它们在自己的脚本中调试的部分).
我显然不能简单地将transpiled_script.js:2映射到original_script.os:1,因为可以在original_script.os中打印多个调用,因此它不是1到1的关系.
有没有办法做到这一点?
(我使用escodegen生成我的源代码和源地图(escodegen使用Node mozilla / source-map模块),所以有一种方法来告诉escodegen或mozilla / source-map来做到这一点是理想的,但是我可以覆盖escodegen的输出,如果这是不可能的.)
解决方法
您可以拆分跟踪并打印所需的行
var $__Helpers = { print: function(s) { if (typeof s != 'string'){ var err = new TypeError('String expected'); var trace = err.stack.split('\n') console.error(trace[0]); // TypeError: string expected console.error(trace[2]); // the line who called the function,probably //original_script.os:1,or whatever line number the call was from //quit the script } console.log(s); } };
编辑:一个更好的解决方案,就是替代跟踪的错误,比扔它,代码现在看起来像这样:
var $__Helpers = { print: function(s) { if (typeof s != 'string'){ var err = new TypeError('String expected: Got'+s); err.stack = err.stack.replace(/\n.*transpiled_script\.js.*?\n/g,"\n"); throw err; } console.log(s); } };