如何使用源映射从转译的代码中隐藏函数调用
How can I hide a function call from transpiled code using source maps?
假设我有一种语言看起来像
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
一个类型错误将由$__Helpers.print
说"预期字符串"抛出。 我希望开发人员工具将print 5
行显示为此错误的原始调用。 我知道如何让我的源映射显示如下所示的调用堆栈
transpiled_script.js:2
original_script.os:1
其中transpiled_script.js:2
是调用$__Helpers.print
函数的脚本和行号,original_script.os:1
是调用print 5
的脚本和行号。 我想让开发工具忽略对transpiled_script.js
的顶级调用(这只是我的转译器的实现细节(,只显示来自原始脚本的调用(这是他们应该在自己的脚本中调试的部分(。
我显然不能简单地将transpiled_script.js:2
映射到original_script.os:1
,因为original_script.os
内部可能会有多个调用print
,所以这不是 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);
} };
这也适用于嵌套调用中的错误。
相关文章:
- 从var向代码隐藏函数传递值
- javascript函数和代码隐藏函数的执行顺序
- 显示生成的gif;base64图像使用C#代码隐藏在img中使用JavaScript
- 使用较少代码隐藏和显示选择菜单内容的更好方法是什么?javascript
- 使用C#将在JavaScript中创建的变量值传递给ASP.Net中的服务器端(代码隐藏)
- 使用ScriptManager.RegisterStartupScript从代码隐藏调用javascript方法
- 正在代码隐藏中检索选定ListBox项的属性数据
- 为什么需要从代码隐藏调用 JavaScript 函数
- 空引用错误 Eval(字符串) 将其传递给代码隐藏中的函数
- 在代码隐藏 (asp.net VB) 中返回“完整”客户端 ID
- 使用 C# 中的代码隐藏在单击按钮时创建 Javascript 警报
- 如何从 C# 代码隐藏调用 JavaScript 函数
- 从 asp.net 代码隐藏中触发JavaScript函数
- ASP:代码隐藏的字段变量在从更新面板中的服务器返回时丢失值
- (“NetworkError:401未经授权)从JavaScript调用代码隐藏方法
- 如何将代码隐藏信息传递到javascript函数中
- 脚本执行,但代码隐藏不执行
- 无法访问字段'通过aspx页面上的javascript函数传递来自代码隐藏中函数调用的客户端id的s值(页面加载
- 访问子窗体的asp代码隐藏中的javascript window.myvariable
- 从Java脚本调用C#代码隐藏代码