-
Notifications
You must be signed in to change notification settings - Fork 1.7k
feat: support expression string for function config #6709
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Pull Request Test Coverage Report for Build 14200117306Warning: This coverage report may be inaccurate.This pull request's base commit is no longer the HEAD commit of its target branch. This means it includes changes from outside the original pull request, including, potentially, unrelated coverage changes.
Details
💛 - Coveralls |
|
可以参考 vega 的看看 https://vega.github.io/vega/docs/expressions/ |
|
我的观点: 方案三,不能代表所有情况,除非我们给不同的 callback 定义不同语义的名字,就需要额外对不同的 key 做不同的逻辑。即使现在可行,未来扩展的时候也会头疼。 方案二,技术上应该是不可行的。 目前只有方案一,是可行,对开发者来说理解上成本也不算高。 |
|
todo list:
|
|
方案一也可以提供一个 vscode 插件来自动提示当前配置下每个模板变量的信息,插件里的规则写好后也可以解析生成为文档的内容。 |
插件对开发者和使用者来说成本还是有的😂 |
我也觉得针对这个能力提供插件,有点过度了,最好是开发者不用插件,就能理解我们的设计,否则有种我们把 A 做复杂之后,再给开发者提供 B 去降低复杂。 |
|
我看着方案1基本是必须依赖文档的,切来切去这个成本,和本身开发的成本可以权衡下。另外我意思不是只针对这个功能专门设计一个插件,只是这个功能刚好不好理解,可以用插件来解决下,这个插件也能集成其他能力,比如意图生成snippets之类的 |
|
插件这东西我只是提一下,本身不阻塞这个pr |
|
@moayuisuda 嗯嗯,了解了~ |
|
|
@BQXBQX WhiteList 我来定一下吧, 先做高优先的,避免带来预见不了的问题。从 ssr 来看,组件、交互、动画都不需要。 所以只保留: style、encode、attr、labels,顺序代表优先级,其他都先去掉。后续有需求再加比出问题移除容易的多。 |


问题背景
G2 在 5.0 版本中增加 spec 的使用方式,未来也会作为主流的使用方式,但是当前 spec 存在一个问题:为了让 spec 更灵活的配置图形样式,支持了大量的 function callback 的方式去支持用户自定义,这样带来问题是 spec 的 function 配置不可序列化,比如对于用户 ssr 场景,期望用户输入的 spec 配置可以持久化存储起来,所以需要用一种 字符串表达式 来描述一个 function。
以此,设计和开源了 expr。
接入到 G2
接入到 G2、G6、L7、S2 等,思路应该是一致的,就是对于所有具备 function callback 的地方支持 expr,并在渲染前解析城渲染器能理解的 function 函数,具体建 expr 的文档。
这里就会遇到一个问题,不同的 function 有不同的参数,且参数的语义不一致,那怎么批量支持 expr 表达式了?
expr 设计时,要求模版语法的参数和 context 中的 key 是严格对应的,但是在 G2 中使用 expr template 语法时,参数名无法统一,回调函数的参数非常多样化,如果简单设置为 datum,i,data,options,语义上会非常不合适,需要考虑多种情况。
方案一 ✅
像 echarts 那样通过 a, b, c, d 无语意化的变量来实现变量的赋值,变量只表示顺序。
方案二
expr 增加 variables() 能力,如下
通过获取模版 expr 中使用到的所有变量,将变量和函数入参进行一一映射,但是这层映射关系怎么实现呢?在 js 动态语法中这层映射是依靠顺序实现的,但我们中获得变量的顺序是无序的。觉得可以通过修改 expr 的模版语法规则或者增加 options 传入参数实现用户自定义顺序,但是感觉大大增加开发者使用成本。(整体思路就是模仿 js 实现一个 值传递 )
方案三
定义一套 80% 普适的变量名。例如:datum、i、data、context。
结论
最终选择方案一,使用无意义参数,弊端是无意义,优势在于:
具体实施
在 runtime 统一入口,对 options 进行递归处理,当前仅仅处理
style,encode,attr,label,children,后续可以追加,具体代码建src/utils/expr.ts。另外,额外注意避免: