我正在寻找在Javascript中实现的轻量级规则引擎的建议。
这种实现的原因是使用一小组规则(少于20个)构建一个非常轻量但快速的基于浏览器的模拟。模拟将需要六个参数并运行规则并在浏览器中显示结果,而无需返回服务器。想象一下带有几个单选按钮,复选框,文本框和滑块的UI来控制参数。模拟将根据任何参数更改快速重新运行。
答案 0 :(得分:13)
我已经实现了你在c#中描述的(更复杂的)版本,并回顾了代码,所有这些都可以用JavaScript来实现。我同意发表的评论,写你自己是一个可行的选择。它可以像你想要的一样简单或复杂。
此类规则引擎的一般观察(无特定顺序):
非线性查找是您的朋友。在JavaScript中,使用obj[key] = val
语法很容易。确定给定参数集的规则输出后,请缓存其结果,以便您可以再次使用它而无需再次执行规则。
确定是否需要处理唯一的输入组合。例如,假设您允许用户输入多个名称并询问有关XYZ的建议。实际上,您现在需要针对每个输入值运行所有规则。这可能是无关紧要的,简单的或非常复杂的(想象一下酒店预订系统需要多个日期,时间,地点和标准,并提出建议)。
setTimeout()可用于平滑UI行为,但您描述的规则应在几毫秒或更短的时间内执行,因此最后担心性能。与基本规则引擎相比,性能不是一个值得关注的问题。
如果规则定义是对象(甚至是简单的对象树),则最容易操作。
不要将UI元素绑定到输出结果;意思是,将规则执行的结果放入一个灵活的对象列表中,这样你就可以从中创建任何你想要的视觉输出。
自定义输出消息对用户非常有用。这意味着,不要在满足条件时触发通用消息,而是尝试在输出消息中插入一个实际值,例如“您的信用评分仅为550.您需要至少600才能继续。”
这就是我的头脑。祝你好运。
答案 1 :(得分:12)
查看纯JavaScript中为node.js实现的nools规则引擎。它有一个非常简单的规则定义语法。
答案 2 :(得分:5)
Rule Reactor(https://github.com/anywhichway/rule-reactor)是一个轻量级,快速,富有表现力的正向链接业务规则引擎,它利用JavaScript内部,懒惰的交叉产品和函数作为对象而不是Rete。它可以在浏览器或服务器上使用。
答案 3 :(得分:2)
这是一个非常简单的规则引擎,它使用服务器端的javascript(Mozilla的Rhino引擎)(也许对你有帮助) http://jubyrajan.blogspot.com/2010/04/implementing-simple-deterministic-rule.html
答案 4 :(得分:1)
我为产品配置器制作了一个示例html / javascript规则引擎。规则引擎基于if语句。将使用数组检查if then语句。每次更改选项时,此数组都会填充所有可能的选项。 查看我的博客中的示例。 Link to my blog "Forward chaining javascript rule engine"
我认为“obj [key] = val”是javascript规则引擎的关键。 Jquery有助于javascript处理。
答案 5 :(得分:1)
请查看(JSL)https://www.npmjs.com/package/lib-jsl。
从概述文档中,JSL是一个基于JSON的逻辑编程库,用于在JS程序中嵌入使用。它使用JSON作为语法和I / O方法,并为主机环境提供回调以进行性能优化。