14个不稳定版本 (3个重大变更)
0.6.0-alpha.2 | 2024年8月7日 |
---|---|
0.5.6 | 2024年7月18日 |
0.5.0 | 2024年3月28日 |
0.4.3 | 2023年12月7日 |
0.0.1 | 2022年12月9日 |
#87 in 过程宏
16,338 每月下载量
用于 41 个库 (9 个直接使用)
310KB
6.5K SLoC
Dioxus-RSX
概述
此库提供了Dioxus在rsx!
宏中使用的实际DSL。此库与宏库分开,以启用自动格式化、翻译和AST操作(提取到组件)等工具。
贡献
- 在我们的问题跟踪器上报告问题。
- 加入Discord并提问!
设计
此库的架构已经经过几次重新设计,我们希望最终确定了一个我们满意的设计。
目前仍有考虑通过扁平化AST来提高增量解析和性能,而不需要在数据结构中添加元数据。
但是,目前我们确定的设计是
- 包含单个TemplateBody的单个顶级CallBody
- 每个TemplateBody都拥有自己的动态映射,在解析后填充(...而不是在解析时)
- 对于字面量等事物,热重载信息作为最终遍历树中的节点传递
这使得我们可以增量构建树,使其模块化/更容易测试,以换取额外的“簿记遍历”。
簿记遍历的好处是
- 它们是可选的
- 它们通常相当快速
- 它们可以作为构建树的一部分在不同级别强制执行
当然,主要的缺点是它们1) 更慢,2) 需要一种存储元数据的方式,它们通常将这些元数据存储在节点本身上。有时你可能甚至不想收集我们目前无法退出的元数据。
这可能会使得关于树的全球推理变得有些困难,因为你需要挖掘每个节点以获取其元数据,但局部推理要好得多。之前我们将元数据存储在一种二级“视图”类型的项目中——这没问题... 但对于长期运行的、持久化可查询树对象程序来说并不理想。
我们想要查询树
- 以获取其动态映射
- 以获取其热重载的内容
另一种方法可以是
- 扁平化AST
- 单个“解析器”IE
self.parse_element
/self.parse_component
我在解析器上做了一些研究,但找不到很多(任何?)实现有状态的解析器。
我们确实想要对这些项目有一个引用——目前是通过它们的路径,但也可以通过每个节点的ID来完成。不幸的是,除了Arc/Rc之外,没有简单的方法来“池化”这些。
无论如何,直到我们的应用程序受到查询性能的限制,保持树未展开似乎是可行的。JavaScript DOM有一个类似的API,在修改后刷新更改,但也有一个通过指针的ID系统。我们可以尝试使用类似generational-box或只是Arc/Rc的东西添加ID。
请注意,我们仍然不能得到类似正确树-sitter类型解析器的“好处”(增量跳过标记化),但这实际上是不可能的,除非成为LSP的一部分。从理论上讲,我们可以最终使用LSP来帮助就地修改树,然后在你想就地修改树时“修复”它。话虽如此,即使我们知道它们的形状已经改变,我们仍然需要执行两个rsx!树的比较。
许可证
该项目受MIT许可证的许可。
除非你明确说明,否则你提交给Dioxus的任何有意贡献都将按照MIT许可证进行许可,不附加任何额外的条款或条件。
依赖关系
~0.6–6.5MB
~34K SLoC