1 个不稳定版本

0.205.0 2024年4月19日

#1409 in WebAssembly


wasi-update 中使用

Apache-2.0 WITH LLVM-exception

2.5MB
57K SLoC

wit-component

wit-component 是一个用于基于 组件模型提案 创建和交互 WebAssembly 组件的 crate。

命令行使用

通过 wasm-tools 命令行工具包,wit-component crate 可通过两个子命令获得

# Create a component from the input core wasm module
$ wasm-tools component new core.wasm -o component.wasm

# Extract a `*.wit` interface from a component
$ wasm-tools component wit component.wasm

功能

  • 从输入的核心 WebAssembly 模块创建 WebAssembly 组件二进制文件。输入模块通过 规范 ABI 与使用 *.wit 文件 描述的导入和导出接口进行通信。wit 接口可以直接嵌入到核心 wasm 二进制文件中。

  • 支持“适配器”,可用于将旧版核心 WebAssembly 导入函数桥接到 组件模型 函数。适配器本身是核心 wasm 二进制文件,将被嵌入到最终组件中。适配器的导出可以被主核心 wasm 二进制文件导入,然后适配器可以调用组件模型导入。

  • 可以从现有组件中提取 *.wit 接口,以查看其导出和打算导入的接口。

使用方法

请注意,此 crate 的目的是组件工具的低级细节。开发者可能不会每天与这种工具交互,而是使用 cargo-component 等包装器,该包装器将自动执行 wit-component 以生成组件二进制文件。

首先,wit-component 支持基于 wasm 的 WIT 包编码

$ cat demo.wit
package my:demo;

interface host {
  hello: func();
}

world demo {
  import host;
}

$ wasm-tools component wit demo.wit -o demo.wasm --wasm

# The output `demo.wasm` is a valid component binary
$ wasm-tools validate --features component-model demo.wasm
$ wasm-tools print demo.wasm

# The `*.wit` file can be recovered from the `demo.wasm` as well
$ wasm-tools component wit demo.wasm

工具链作者可以使用 wit-component 将此组件类型部分嵌入到核心 wasm 二进制文件中。在这里,我们将使用一个原始的 *.wat wasm 文本文件进行小型演示,其中 demo.wit 参数是手动指定的,然而。

$ cat demo.core.wat
(module
  (import "my:demo/host" "hello" (func))
)

$ wasm-tools component embed demo.wit --world demo demo.core.wat -o demo.wasm

# See that there's a new `component-type` custom section
$ wasm-tools objdump demo.wasm

# Convert the core wasm into a component now
$ wasm-tools component new demo.wasm -o demo.component.wasm

# Like before the output `demo.wasm` is a valid component binary
$ wasm-tools validate --features component-model demo.component.wasm
$ wasm-tools print demo.component.wasm

# Additionally like before the `*.wit` interface can still be extracted
$ wasm-tools component wit demo.component.wasm

这里,可以将 demo.component.wasm 运输到组件运行时或嵌入到宿主中。

依赖项

~3–4MB
~67K SLoC