web-sys 概述

web-sys crate 具有以下文件和目录布局

.
├── build.rs
├── Cargo.toml
├── README.md
├── src
│   └── lib.rs
└── webidls
    └── enabled
        └── ...

webidls/enabled/*.webidl

这些是我们将实际为其生成绑定的 WebIDL 接口(或者至少是为这些文件中定义的某些内容生成绑定)。

build.rs

build.rswebidls/enabled 中的所有 WebIDL 文件上调用 wasm-bindgen 的 WebIDL 前端。它将生成的绑定写入 cargo 构建的输出目录中。

src/lib.rs

src/lib.rs 唯一做的事情是在编译时将 build.rs 中生成的绑定包含进来。以下是整个 src/lib.rs 文件

#![allow(unused)]
fn main() {
//! Raw API bindings for Web APIs
//!
//! This is a procedurally generated crate from browser WebIDL which provides a
//! binding to all APIs that browsers provide on the web.
//!
//! This crate by default contains very little when compiled as almost all of
//! its exposed APIs are gated by Cargo features. The exhaustive list of
//! features can be found in `crates/web-sys/Cargo.toml`, but the rule of thumb
//! for `web-sys` is that each type has its own cargo feature (named after the
//! type). Using an API requires enabling the features for all types used in the
//! API, and APIs should mention in the documentation what features they
//! require.

#![doc(html_root_url = "https://docs.rs/web-sys/0.3")]
#![allow(deprecated)]

mod features;
pub use features::*;

pub use js_sys;
pub use wasm_bindgen;

/// Getter for the `Window` object
///
/// [MDN Documentation]
///
/// *This API requires the following crate features to be activated: `Window`*
///
/// [MDN Documentation]: https://mdn.org.cn/en-US/docs/Web/API/Window
#[cfg(feature = "Window")]
pub fn window() -> Option<Window> {
    use wasm_bindgen::JsCast;

    js_sys::global().dyn_into::<Window>().ok()
}
}

Cargo 功能

编译时,crate 默认情况下几乎是空的,这可能不是你想要的!由于 API 数量众多,此 crate 使用功能来启用其 API 的部分,以减少编译时间。Cargo.toml 中的功能列表都对应于生成的函数中的类型。启用一个功能会启用该类型。所有方法都应指示使用该方法需要激活哪些功能。