小程序eval替代方案:eval5 1.4.0-1.4.5 发布日志
eval5是基于TypeScript编写的JavaScript解释器,100%支持ES5语法。
支持浏览器、node.js、小程序等 JavaScript 运行环境 。
项目地址: https://github.com/bplok20010/eval5
使用场景
- 浏览器环境中需要沙盒环境来执行JavaScript代码
- 浏览器环境控制代码执行时长
- 不支持eval/Function的JavaScript运行环境,如:微信小程序 示例
更新日志
1.4.5
- 修复with语句中函数调用时丢失this信息
1.4.4
- 修复在未使用try-catch情况下出现异常时导致下次调用evaluate时的变量声明错乱问题。
1.4.3
- 修复 WithStatement 中赋值不生效问题。
- rootContext创建调整为:Object.create(options.rootContext),防污染。
1.4.2
- 新增内置对象:URIError RangeError SyntaxError ReferenceError
- 修复 assignment 表达式触发对象的getter方法调用
1.4.1
- 修复再次执行事超时机制失效问题
- 修复函数表达式赋值时引起的返回值错乱问题
1.4.0
- 解释器内部eval/Function重写
- 新增参数 options.rootContext
- 新增参数 options.globalContextInFunction
- 移除Interpreter.rootContext
运行原理
eval5先将源码编译得到树状结构的抽象语法树(AST)。
抽象语法树由不同的节点组成,每个节点的type标识着不同的语句或表达式,例如: 1+1的抽象语法树
{
"type": "Program",
"body": [
{
"type": "ExpressionStatement",
"expression": {
"type": "BinaryExpression",
"operator": "+",
"left": {
"type": "Literal",
"value": 1,
"raw": "1"
},
"right": {
"type": "Literal",
"value": 1,
"raw": "1"
}
}
}
],
"sourceType": "script"
}
根据节点type编写不同的处理模块并得到最终结果。例如:根据1+1的语法树我们可以写出一下解释器代码:
function handleBinaryExpression(node) {
switch( node.operator ) {
case '+':
return node.left.value + node.right.value;
case '-':
return node.left.value - node.right.value;
}
}
示例
以下是解析echarts4效果示例: