Skip to main content
Version: 0.18.0

選擇 web-sys 或 stdweb

簡介#

Yew apps 可以用 web-sysstdweb 編譯。這兩個 creates 都提供了 Rust 與 WebAPIs 的連結。當把 yew 加進你的依賴時,請擇其一使用:

{% code title="Cargo.toml" %}

# 選擇 `web-sys`yew = { version = "0.13", features = ["web_sys"] }
# 選擇 `stdweb`yew = { version = "0.13", features = ["std_web"] }

{% endcode %}

我們建議使用 web-sys,因為他是由 Rust / Wasm Working Group 維護。

使用範例#

// web-syslet window: web_sys::Window = web_sys::window().expect("window not available");window.alert_with_message("hello from wasm!").expect("alert failed");
// stdweblet window: stdweb::web::Window = stdweb::web::window();window.alert("hello from wasm!");
// stdweb with js! macrouse stdweb::js;use stdweb::unstable::TryFrom;use stdweb::web::Window;
let window_val: stdweb::Value = js!{ return window; }; // <- JS syntax inside!let window = Window::try_from(window_val).expect("conversion to window failed");window.alert("hello from wasm!");

兩個 crates 提供的 APIs 雖然不一樣,但是他們的目標與功能大致相同。

比較#

以下列出幾點,幫助你從不同的角度去考慮要使用 web-sys 還是 stdweb。請注意,雖然你可以兩個 crates 都使用,但是為了減少編譯成 .wasm 的檔案大小,最好還是只選一個使用。

web-sysstdweb
專案狀態Rust / Wasm Working Group 持續維護中GitHub repo 已經有四個月沒有動靜了
Web API 覆蓋率Rust APIs 是由 Web IDL 自動產生,所以應該已經有 100% 的覆蓋率依社群所需加入 Browser APIs
Rust API 設計使用保守的方式,大多的 API 呼叫後會返回 Result通常比起使用 Result 更傾向於直接造成 panic。例如,在 worker 中呼叫 stdweb::web::window() 的話就會 panic。
支援的建置工具
  • wasm-bindgen
  • wasm-pack
  • cargo-web
  • wasm-bindgen
  • wasm-pack
支援的目標平台
  • wasm32-unknown-unknown
  • wasm32-unknown-unknown
  • wasm32-unknown-emscripten
  • asmjs-unknown-emscripten