PowerFx是一门语言。虽然它推荐的场景是low-code,但是我们必须从语言的角度来看,才能更好的理解它。PowerFx的创建是为了更好地帮助非专业的开发人员,所以语言被设计得足够简单,可以同时服务于专业和非专业的开发人员,这是一个非常崇高的理想。本周我们将通过这篇MicrosoftPowerFx概述文章更深入地了解该语言是如何完成的。概述Notify("thisisaproblem",Error)这是PowerFx语言的一个例子,乍一看没什么特别的。PowerFx描述了canvas应用程式语言,即这种编程语言是专门为canvas引用而设计的。那么什么是画布应用程序?Low-code、建站、BI、WebExcel都是canvas应用,所以PowerFx其实是一种适应canvas场景,直接面向用户的语言。那么这种canvas语言应该具备哪些特性呢?PowerFx团队考虑了一下:简单:语言的设计本着简单的原则,让非开发人员也能轻松上手。Excel一致性:它可以帮助Excel开发人员进行知识转移。部分原因与MicrosoftExcel的成功有关。另一方面,在canvas语言领域对Excel表达式的探索,着实深入,令人向往。尝试借用SQL这种声明式语言,不尽如人意。Declarative:这个是最重要的,也就是描述做什么,而不是如何做,什么时候做。这有点像Jquery切换到React模式时过程代码和数据驱动代码的区别。函数式风格:函数式风格在灵活性和易用性上有着天然的优势,无副作用的特点也有利于理解逻辑和编译优化。组合:利用函数式风格的特点,建议利用已有的功能组合新的功能,而不是在每个组件上重复实现或重新配置Sort、Filter等功能。强类型:类型对于可维护性至关重要。无论多么强大的低代码语言,如果没有类型支持,都谈不上易学。类型推断:可以自动推断类型。这个和强类型一样,有点TS的感觉,主要是方便写出简洁的代码。不推荐面向对象:既然推荐函数式风格,当然不推荐面向对象。可扩展性:开发者必须具备扩展功能和组件的能力,支持通过Javascript进行扩展。对开发者友好:在不与前面的原则相冲突的情况下,语言应尽可能对开发者友好。语言迭代:当语法发生变化时,需要帮助用户顺利迁移。毕竟,这种语言是直接针对普通用户而不是专业开发人员的。PowerFx提供了这种能力,对每个文档进行版本控制,并在升级后通过“兼容转换器”自动将旧语法升级为新语法。Noundefinedvalue:为了简化语言带来的理解成本,去除了undefinedvalue。因此,基于这些考虑,PowerFx是这样设计的:实时性,即无论出现任何UI或语法错误,都不会阻塞其他正常节点的工作,同时,代码效果和实时反馈错误信息。这保证了在画布应用中编写逻辑的良好体验,因为画布应用本身是实时的,低代码能力本身必须与画布的实时性能相结合。低代码特性意味着任何UI组件都不需要描述像onChange这样的回调,它们只需要声明使用的变量,当这些变量发生变化时,程序会自动、异步、按需更新使用的组件。与无代码结合所谓无代码就是通过UI形式可视化的配置canvas应用。与无代码的结合是任何属性都可以用低代码编写,即一个表达式,同时也提供了一个UI形式供编辑。UI表单编辑后,可以低代码重新处理,低代码属性编辑,表单不可编辑。这时候点击表单编辑会跳转到低代码编辑框。精读要创建一种无需学习就能使用的编程语言,需要足够简单,即从用户的角度理解事物:例如,如果用户不知道回调函数的概念,那么屏蔽所谓回调函数的概念,让一切成为表达式。这些表达式看起来简单直观,会自动驱动UI重绘,即声明式编程。我们来讨论几个有趣的点:为什么不用Js?大多数画布应用程序是指Web应用程序。甚至Excel也已经转变为WebExcel。就微软而言,从早期向OfficeOnline的转型便可见一斑。不过Js是浏览器支持的脚本语言,入门成本比较低。其实很多低代码平台内置的编程语言就是Js。平台最终会转为Js执行。创造一门新语言费那么大劲,是因为感觉Js还不够“零门槛”。首先,第一点就是不符合Excel表达式规范。让我们不要忘记PowerFx也很谨慎。它要借助Excel生态来扩大用户群,所以第一目的就是兼容Excel语法。比如Excel用&来连接字符串,而Js用+来连接。虽然我觉得+号比较自然,但微软还是觉得应该符合Excel用户的使用习惯。老实说,除了Excel的语法外,我很难理解为什么&连接字符串“更容易学习”而+连接字符串“对程序员更友好”。但是有些被批准了,比如去掉了undefined的值,这确实让语言更容易理解。也许在未来,PowerFx会更进一步,引入类似SQL的描述性语法,像编写自然语言一样进行编程。从这个程度上来说,有了强类型提示,在特定场景下会比Js更好。提供内置函数Js提供了大量的内置函数,这似乎不是PowerFx的专利,但是PowerFx提供了很多UI级的功能,比Js指向的alert强多了。PowerFx提供了Confirm和Notify来弹出用户输入的提示窗口,甚至形成逻辑,几乎只需要一行代码:If(Confirm("Areyousure?",{Title:"DeleteConfirmation"}),Remove(ThisItem))如你所见,这充满了异步操作:等待用户输入。删除元素。但是这些内置函数的组合将异步效果转换为同步写入,大大降低了开发成本。另一种内置函数封装了业务属性。例如User可以获取当前用户信息。获取用户信息本来是需要代码开发的,但是低代码平台本身已经实现了全套的账户体系,所以低代码平台可以直接提供User().Email等函数来访问当前用户的邮箱地址。还有Reset等函数,可以将控件重置为默认值,比如Reset(TextInput1),其实就是把平台提供的所有上层能力抽象成低代码函数供用户调用,这样,用户只需支付少量的学习成本。获得比简单的UI强大得多的应用程序编辑能力是值得学习的。更多公式函数请参考文档。提供对表的操作和对表的操作,使应用程序数据管理可以用与Excel相同的概念来对待。这种统一的方法是将数据抽象成表。PowerFx提供了一系列表格处理函数:AddColumns(Filter(Products,'QuantityRequested'>'QuantityAvailable'),"QuantityToOrder",'QuantityRequested'-'QuantityAvailable')这些函数可以跨操作语言Excel、SqlServer等数据源的数据学习成本和SQL差不多。其实在这一点上,对低代码用户的要求并不低,至少可以与熟练使用计算公式的Excel用户相提并论。综上所述,UI编辑能力有限但好用,编码能力最强但难用。PowerFx为我们提供了一个折衷方案,即提供一个“高度封装的简化代码”供用户使用。看看其他的低代码平台,也有一个类采用了另一种折衷的方案,那就是超级复杂的编辑UI。顶峰产品是逻辑布局。这个方向在特定领域也是不错的选择。参考:精读《低代码逻辑编排》。讨论地址为:精读《Microsoft Power Fx》·第355期·dt-fe/weekly想参与讨论的请戳这里,每周都有新话题,周末或周一发布。前端精读——帮你过滤靠谱的内容。关注前端精读微信公众号版权声明:免费转载-非商业-非衍生保留属性(CreativeCommons3.0License)