我正在与一位朋友合作进行一项小型Javascript实验,该实验涉及一个基本的HTML解析器,实现为一个简单的状态机 - 您可以see the code here。
我的问题是关于标记模板函数,涉及任何类型的解析器,关于错误报告 - 也就是说,如果解析器检测到无效状态,它需要报告在输入中找到错误的位置。
我的问题是以一种有意义的方式跟踪和/或解释发现错误的位置。
标记模板函数的输入实际上是源代码(在我的情况下是HTML)与Javascript值的交替,所以你不能简单地(正如我现在所做的那样,就像你在大多数情况下所做的那样)普通解析器)计算字符并报告位置,因为交替的Javascript值可能不是字符串,或者可能是不能被解析为字面值的字符串。
标记模板函数是否有办法发现交替输入字符串/值的源文件位置?
或者我是否正确怀疑这种运行时设施几乎是不可能的?实际上没有实用的方法,没有使用Javascript解析器,可能是提前发现和记录源位置吗?
答案 0 :(得分:1)
这里可以做的就是输出问题发生的预期背景。考虑到问题是由three
:
const three = null;
`one${two}${three}four`
标记函数参数可以在错误消息中连接到它们开始有意义的点,例如。
Expected a number as an expression at position 2, got `null`,
`one${...}${...}four`
^^^
如果需要new Error().stack
,也可以检索堆栈跟踪。
如果需要更高的精度,则应使用模板引擎而不是模板文字,因为在模板编译期间所有必需的数据都可用。
标记功能的选项与任何其他功能相同。如果使用foo
变量调用bar
函数作为等于1
的参数(如foo(bar)
),则可能无法确定是否使用{{1}调用它来自bar
内部,因为我们所拥有的只有foo
值。只有当我们有堆栈跟踪和访问源文件时才会发现它被称为1
这一事实 - 这是我们在正常情况下所不具备的。该方法可用于应在上下文中提供反馈的情况,例如,测试运行器 - 因为它负责脚本加载并且可以访问源文件。