征求意见:新嵌入 协议
发布于 2023 年 5 月 20 日,作者 Natalie Weizenbaum
如果您不是嵌入式 Sass 协议的主机包的作者,您可以跳过这篇文章——虽然如果您足够痴迷,您可能会发现它很有趣 无论如何!
我们计划对嵌入式 Sass 协议进行一些重大更改,我们希望在锁定新的做事方式之前获得您的反馈。我们打算一次性进行一些重大更改,以将对用户的 中断次数降至最低。
我们计划进行两个主要的重大 更改
-
Dart Sass 嵌入式主机将不再作为独立的可执行文件发布。它现在将被捆绑到主 Dart Sass 可执行文件中,可以通过运行
sass --embedded
访问。 -
嵌入式协议中的每个数据包现在都包含一个编译 ID 作为数据包结构的一部分,而不是在协议缓冲区 定义中声明它。
我们利用这个机会还引入了三个较小的重大 更改
-
嵌入式协议的规范和协议缓冲区定义已移至 Sass 语言存储库,以便它们可以与语言和 JS API 的更改同时更新。
-
嵌入式协议现在使用协议缓冲区语言功能明确声明可选字段。这意味着不再将各种字段的“默认值”视为 未设置。
-
CompilationSuccess.loaded_urls
字段已移至CompilationResult.loaded_urls
,以便即使编译失败也可以使用它。这允许观察器实现知道要监视哪些文件以重新进行失败的 编译。
存储库组织更改已完成,但对协议本身的更改已在 语言 存储库中的提案中 全面记录。
组合可执行文件组合可执行文件永久链接
将嵌入式 Dart Sass 合并到主 Dart Sass 可执行文件中的主要好处是为嵌入式主机提供一种简单的方法来向用户公开标准 Dart Sass 命令行 API。现在,每个安装任何嵌入式主机的用户都将拥有完整的 Dart Sass 可执行文件,可在本机 Dart VM 速度下使用。
这也通过减少我们需要管理的独立存储库和发布流程数量来帮助简化 Sass 团队的组织。
线级编译 ID线级编译 ID 永久链接
我们将编译 ID 拉到协议级别,以便提供更好的并发性,特别是在嵌入式编译器方面。由嵌入式编译器完成的 Sass 编译在彼此之间不共享任何状态,这意味着理论上它们可以在完全独立的工作线程中运行。但是,使用现有的嵌入式协议,将每个消息定向到正确的工作线程需要在主线程上解析整个消息以确定它属于哪个编译,然后在工作线程中再次解析它以实际处理 它。
将编译 ID 作为协议本身的一部分可以解决这个问题。每个端点都可以读取 ID,查找处理编译的工作线程,并将消息传递给该线程,而无需解析消息的其余部分。这使得并发性变得更加容易和高效,这将有助于确保大型编译能够尽快完成 。