Cookie Clicker游戏Mod如何获取用户提交JS代码的报错行列位置?
解决方案
方案1:使用sourceURL标记(最简实现,无额外依赖)
浏览器原生支持//# sourceURL指令,你可以给用户代码末尾追加该指令,让浏览器将这段用户代码识别为独立的虚拟文件,报错的行列信息会直接映射到用户代码本身,不会指向你Mod源码里new Function的位置。
修改后的校验代码如下:
try{ // 先过滤用户代码中自带的sourceURL避免冲突 const cleanedUserCode = code.value.replace(/^\/\/# sourceURL.*$/mg, ''); // 追加sourceURL标记,指定虚拟文件名 const markedUserCode = cleanedUserCode + '\n//# sourceURL=user-custom-code.js'; let func = new Function(markedUserCode); func.call(null, [[0, 1, 2], Game]); save.classList.remove('ModBuildingSorter_unsaved'); } catch(e){ if (e instanceof SyntaxError) { // 错误的lineNumber、columnNumber属性直接对应用户代码的行列 alert(`语法错误:${e.message}\n出错位置:第${e.lineNumber}行 第${e.columnNumber}列`); } else { // 运行时错误也可以通过e.stack提取对应行列信息 alert(`运行错误:${e.message}`); } console.dir(e); }
你给出的缺失闭合括号的示例用该方案测试,捕获到的错误行号会直接返回4,完全匹配实际出错位置。
方案2:静态语法校验(更安全,无需执行用户代码)
如果担心直接执行用户代码存在安全风险,可以将轻量JavaScript语法解析库打包进你的Mod中,在校验阶段直接解析用户代码的语法树,不需要执行代码就能提前捕获所有语法错误和对应的行列位置,同时还能自定义校验规则,限制用户代码的可用API范围,避免恶意代码执行。
内容的提问来源于stack exchange,提问作者Frustrated programmer
相关产品推荐
相关产品推荐

