评论

小程序eval/Function终极替代方案:eval5

小程序eval/Function替代方案-JavaScript解释器

由于小程序内部禁用了eval、Function导致在一些场景下无法动态执行脚本,小程序又只支持JavaScript开发,如果想要在在前端动态执行脚本就得实现对于的脚本解释器。


eval5是完全基于JavaScript编写的JavaScript解释器,支持ECMA5语法


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


实现原理:

  1. 使用acorn或esprima编译器对JavaScript代码进行编译并得到抽象语法树(AST)
  2. 用JavaScript解析语法树并得到计算结果

例如:1+1的解析

一、使用acorn编译后得到的语法树,语法树由不同的节点组成各个节点的type代表着不同的语句或表达式类型:

{
    "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"
}

二、得到语法树后,我们可以根据不同的节点类型实现不同的处理函数,例如:

function handleBinaryExpression(node) {
    switch( node.operator ) {
        case '+':
            return node.left.value + node.right.value;
        case '-':
            return node.left.value - node.right.value;
    }
}


如何使用

一、使用npm安装:

npm install --save eval5


二、使用打包好的eval5.js


使用示例:

// npm install --save eval5
import {Function,evaluate} from 'eval5'; //or 'path/eval5.js'

const sum = new Function('a', 'b', 'return a+b');
sum(100,200)

evaluate('1+1')


eval5基于小程序编写的示例:eval5-wx-demo github地址

最后一次编辑于  2020-02-19  
点赞 10
收藏
评论

5 个评论

  • Thinking80s
    Thinking80s
    2021-05-07

    这种方式会不会导致小程序被封禁 ?

    2021-05-07
    赞同 6
    回复 3
    • Thinking80s
      Thinking80s
      2022-06-29
      已经禁封了
      2022-06-29
      2
      回复
    • old.Wang.
      old.Wang.
      2022-07-09
      被封禁了怎么办?大神
      2022-07-09
      回复
    • QK
      QK
      04-02
      是审核时封禁的吗
      04-02
      回复
  • 〆、勿扰
    〆、勿扰
    2021-04-15

    这种方式会不会导致小程序被封禁 ?

    2021-04-15
    赞同 6
    回复 3
    • 大白
      大白
      2022-07-31
      已经禁封了
      2022-07-31
      回复
    • 大白
      大白
      2022-07-31
      已经禁封了
      2022-07-31
      回复
    • QK
      QK
      04-02回复大白
      是审核时封禁的吗
      04-02
      回复
  • Leson
    Leson
    2022-02-22

    这种方式会不会导致小程序被封禁 ?

    2022-02-22
    赞同 1
    回复 2
    • 大白
      大白
      2022-07-31
      已经禁封了
      2022-07-31
      回复
    • 大白
      大白
      2022-07-31
      已经禁封了
      2022-07-31
      回复
  • 五杀小王子
    五杀小王子
    04-11

    被禁封会不会是这个工具名字的问题,以及代码注释中的eval词汇

    04-11
    赞同
    回复
  • wu wei
    wu wei
    2022-07-14

    笑了,哭了

    2022-07-14
    赞同
    回复
登录 后发表内容