选择一个web库

简介

Yew 应用程序可以通过 web-sys 或者 stdweb 来构建。这两个 crates 提供了 Rust 和 Web API 之间的绑定。当把 yew 添加到你的 cargo 依赖时,你需要选择它们其中之一:

  1. # 选择 `web-sys`
  2. yew = "0.17"
  3. # 选择 `stdweb`
  4. yew = { version = "0.17", package = "yew-stdweb" }

我们建议选择 web-sys,因为它是由 Rust / Wasm 工作组 提供支持。

选择一个web库 - 图1危险

Yew 对stdweb的支持将会停留在 v0.18 。它仍然接受补丁修复,但不会添加新功能。见#1569

示例用法

此示例说明了这两个库在使用中的差异。你不需要自己再运行一遍这个。

  1. // web-sys
  2. let window: web_sys::Window = web_sys::window().expect("window not available");
  3. window.alert_with_message("hello from wasm!").expect("alert failed");
  4. // stdweb
  5. let window: stdweb::web::Window = stdweb::web::window();
  6. window.alert("hello from wasm!");
  7. // stdweb 搭配 js! 宏
  8. use stdweb::js;
  9. use stdweb::unstable::TryFrom;
  10. use stdweb::web::Window;
  11. let window_val: stdweb::Value = js!{ return window; }; // <- 里面使用 JS 语法
  12. let window = Window::try_from(window_val).expect("conversion to window failed");
  13. window.alert("hello from wasm!");

两个 crate 的 API 略有不用,但他们的目标大致相同,功能相似。

选择其中之一

当你在web-sysstdweb之间摇摆不定时,参考以下几个不同的角度进行考虑。请注意,可以在一个应用程序中同时使用这两种方法,但要最小化已编译 crate 的二进制大小,最好仅使用两者之一。

web-sysstdweb
项目状态Rust / Wasm 工作组积极维护超过八个月没有任何Github活动
Web API 覆盖率Rust API 是根据 Web IDL 规范自动生成的浏览器 API 是根据需求由社区添加
Rust API 设计采取保守的方法,为大多数 API 调用返回 Result通常不会返回Result而更倾向于使用 panic。例如,在 worker 中调用 stdweb::web::window()将 panic。
支持的构建工具

  • trunk
  • wasm-pack

  • cargo-web
支持生成的目标代码
  • wasm32-unknown-unknown
  • wasm32-unknown-unknown
  • wasm32-unknown-emscripten
  • asmjs-unknown-emscripten