eval5 JavaScript 解释器, 1.4.0-1.4.5 发布日志

2020-04-19 10:03:31 +08:00
 nobo

eval5 是基于 TypeScript 编写的 JavaScript 解释器,100%支持 ES5 语法。

支持浏览器、node.js 、小程序等 JavaScript 运行环境 。

项目地址: https://github.com/bplok20010/eval5

使用场景

更新日志

1.4.5

1.4.4

1.4.3

1.4.2

1.4.1

1.4.0

运行原理

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 效果示例:

2144 次点击
所在节点    程序员
8 条回复
neilp
2020-04-19 11:22:51 +08:00
性能测试过吗
gkiwi
2020-04-19 13:19:24 +08:00
今天还和同事扯淡,你执行这个试试:

var a=1;{a=2;function a(){};a=3};console.info(a);
nobo
2020-04-19 17:32:44 +08:00
@gkiwi
因为 es5 没有块级作用域,所以输出是:3
gkiwi
2020-04-19 18:27:03 +08:00
@nobo #3 soga !我以为输出的是 undefined 。。( https://bplok20010.github.io/eval5/)
代码很棒!
nobo
2020-04-19 18:33:53 +08:00
@gkiwi 谢谢
zhouyg
2020-04-20 15:45:14 +08:00
为啥不实现可以直接执行 es6 或者 typescript 的代码?
nobo
2020-04-20 18:03:19 +08:00
@zhouyg
es5 的语法相对少,实现会简单点,可以先将 es6 转换成 es5 。
nobo
2020-04-20 18:09:09 +08:00
@neilp
没有,eval5 就是解析 AST 来实现,目前我也没有很好的优化方案。如果相比 js 的 eval 肯定是远远不如。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/663910

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX