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