Javascript 无限回路保护

Javascript 无限回路保护,javascript,infinite-loop,esprima,Javascript,Infinite Loop,Esprima,我正在开发JavaScript代码编辑器,用户可以在浏览器中编写自己的JavaScript代码并运行它。我需要找到一种打破无限循环的方法。当我收到代码时: while (1) { doSomething(); } 我想将代码转换为如下内容: var start = Date.now(); while (1) { if (Date.now() - start > 1000) { break; } doSomething(); } 我偶然发现了网络制作人。我无法获取

我正在开发JavaScript代码编辑器,用户可以在浏览器中编写自己的JavaScript代码并运行它。我需要找到一种打破无限循环的方法。当我收到代码时:

while (1) {
    doSomething();
}
我想将代码转换为如下内容:

var start = Date.now();
while (1) {
    if (Date.now() - start > 1000) { break; }
    doSomething();
}
我偶然发现了网络制作人。我无法获取转换传入代码的函数。我尝试了
addInfiniteLoopProtection('while(1)doSomething()',{timeout:1000})
,但它返回
'while(1)doSomething()'
,而不是更改代码以打破无限循环

我找到了。通过npm安装Babel单机版和环路保护:

npm i @babel/standalone loop-protect
然后添加JavaScript代码:

import Babel from '@babel/standalone';
import protect from 'loop-protect';

const timeout = 100;
Babel.registerPlugin('loopProtection', protect(timeout));

const transform = source => Babel.transform(source, {
  plugins: ['loopProtection'],
}).code;
transform('while(1)doSomething()')
返回字符串:

var _LP = Date.now();

while (1) {
  if (Date.now() - _LP > 100) break;
  doSomething();
}

相反,您不应该监视线程的资源消耗吗?如果用户希望以低消耗运行无限循环(如定期ping网站),编译器将完全不允许该用例,或者让精明的用户使用递归循环