跳到正文

编写扩展

Rust 应用可以共享普通模块,也可以编写供 Go 和 TypeScript 应用加载的原生扩展。Rust 应用通过 crate feature 启用能力,而不是在配置中列出 extensions。

#选择扩展类型

你要添加的内容需要交付的内容
组件或应用逻辑一个 Rust 模块或 crate
可选的 QuickGUI 能力updater 和 terminal 等 Cargo feature
供 Go 或 TypeScript 使用的原生服务一个 cdylib、一份清单,以及类型化包装

Rust 应用已经链接 quickgui。它不会再加载单独的宿主库。

#创建扩展项目

quickgui init-extension my-extension --type rust

当 Go 或 TypeScript 应用需要消费原生服务时使用此方式。--npm-package 设置产物包名称。

#共享组件

导出返回 Element 的函数:

use quickgui::{Color, Element, text};

pub fn notice(message: impl Into<std::sync::Arc<str>>) -> Element {
    text(message)
        .p(12.0)
        .bg(Color::rgb8(239, 246, 255))
        .text_color(Color::rgb8(30, 64, 175))
        .rounded(8.0)
}

把 notice("Saved") 作为子节点返回。把应用级服务放在 View::render 之外。

#组织原生扩展

原生扩展交付 quickgui.extension.json、带版本的共享库,以及声明的资源。Rust 扩展可以内置 extension_api.rs,并构建 cdylib,无需链接渲染器。原生接口见 Go 的编写扩展指南。

#声明依赖

Rust 应用在 Cargo.toml 中启用 feature。保留项目里已有的 crate 版本:

[dependencies]
quickgui = { version = "...", features = ["terminal"] }

Go 和 TypeScript 使用者在自己的配置中声明扩展包。

#实现原生接口

实现 invoke 和 shutdown。返回前先复制借用的输入,把事件限制在所属会话内,并在会话停止时释放 worker。

#自动注册

Go 和 TypeScript CLI 会打包已声明的扩展。Rust 应用没有额外要注册的内容:Cargo 会链接你依赖的 crate。

#构建与打包产物

应用编辑只会重建所选 crate。原生实现变化时重建扩展,然后再重建使用它的 Go 或 TypeScript 应用。

#测试与分发

用生成的演示应用测试打包后的 cdylib。Rust 应用直接调用 crate API,而不是 invokeExtension。