69 个版本 (37 个稳定)

4.3.6 2024 年 8 月 22 日
4.3.5 2024 年 7 月 16 日
4.3.2 2024 年 6 月 11 日
4.2.6 2024 年 3 月 4 日
0.1.0 2018 年 10 月 24 日

#14 in WebAssembly

Download history 22360/week @ 2024-05-02 20476/week @ 2024-05-09 22077/week @ 2024-05-16 18156/week @ 2024-05-23 20905/week @ 2024-05-30 20122/week @ 2024-06-06 27894/week @ 2024-06-13 19984/week @ 2024-06-20 17575/week @ 2024-06-27 31192/week @ 2024-07-04 39597/week @ 2024-07-11 31848/week @ 2024-07-18 20580/week @ 2024-07-25 30849/week @ 2024-08-01 29135/week @ 2024-08-08 31940/week @ 2024-08-15

每月 116,486 次下载
用于 266 个 crates (115 个直接)

MIT 许可证

1.5MB
29K SLoC

wasmer 构建状态 加入 Wasmer Slack MIT 许可证 crates.io

Wasmer 是最受欢迎的 Rust WebAssembly 运行时。它支持 JIT (即时) 和 AOT (即时编译) 以及适合您需求的可插拔编译器。

它旨在安全、安全,并且在任何环境中均可运行。

用法

以下是一个使用 Wasmer 运行以 WAT 格式(文本格式)编写的 WebAssembly 模块的小例子

use wasmer::{Store, Module, Instance, Value, imports};

fn main() -> anyhow::Result<()> {
    let module_wat = r#"
    (module
    (type $t0 (func (param i32) (result i32)))
    (func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32)
        get_local $p0
        i32.const 1
        i32.add))
    "#;

    let mut store = Store::default();
    let module = Module::new(&store, &module_wat)?;
    // The module doesn't import anything, so we create an empty import object.
    let import_object = imports! {};
    let instance = Instance::new(&mut store, &module, &import_object)?;

    let add_one = instance.exports.get_function("add_one")?;
    let result = add_one.call(&mut store, &[Value::I32(42)])?;
    assert_eq!(result[0], Value::I32(43));

    Ok(())
}

探索完整的示例集合.

特性

Wasmer 不仅速度快,而且还被设计为 高度可定制

  • 可插拔编译器 — 引擎使用编译器将 WebAssembly 转换为可执行代码

  • 无头模式 —— 一旦WebAssembly模块被编译,就可以将其序列化到文件中,例如,然后开启无头模式使用Wasmer执行。无头Wasmer没有编译器,这使得它更易于移植且加载速度更快。它非常适合受限的环境。

  • 交叉编译 —— 大多数编译器都支持交叉编译。这意味着可以预先编译一个目标不同架构或平台的WebAssembly模块,然后将其序列化,以便稍后在目标架构和平台上运行。

  • 在JavaScript环境中运行Wasmer —— 使用js Cargo特性,可以将Rust程序使用Wasmer编译成WebAssembly。在这种情况下,生成的WebAssembly模块将期望在JavaScript环境中运行,如浏览器、Node.js、Deno等。在这种特定场景下,没有可用的引擎或编译器,将使用JavaScript环境中的可用引擎。

Wasmer默认附带Cranelift编译器,因为它非常适合开发目的。然而,我们强烈建议在生产环境中使用LLVM编译器,因为它大约快50%,达到接近原生速度。

注意:如果想要同时使用多个编译器,这也是可能的!需要直接通过每个编译器crates导入它们。

阅读文档以了解更多信息


由Wasmer团队用❤️为社区制作

依赖项

~2–15MB
~211K SLoC