用途:这是 xberg 项目中 crates/xberg-wasm 的 WASM 构建约束文档,说明该 crate 在 wasm 目标下的特性集、内部 API 形态与构建配置,供维护者在改动 WASM 相关代码时遵循。
主要能力与约束:WASM 目标位于 crates/xberg-wasm/,基于 wasm-bindgen 构建,内部 API 仅同步。crates/xberg-wasm/src/lib.rs 由 Alef 生成,不可手工编辑。wasm-target 特性包含 no-ort-target、excel-wasm、ocr-wasm、layout-tract、auto-rotate-tract、ner-candle-wasm。RT-DETR 版面检测与 PP-LCNet 文档方向判断走纯 Rust 的 tract 引擎,权重由 JS 流式传入,Rust 不自行拉取(hf-hub/reqwest 仅原生可用)。刻意不引入 tree-sitter,因为 371 种语言语法包会使浏览器 .wasm 超过 jsDelivr 单文件 50 MB 上限。
关键限制:一、无 Tokio 运行时,所有操作内部必须同步,使用 #[cfg(not(feature = "tokio-runtime"))] 分支。二、每个 WASM 兼容的内置提取器必须实现 SyncExtractor(crates/xberg/src/extractors/mod.rs),该 trait 为 pub(crate),仅 crate 内提取器可实现,外部插件不可;它不属于公开 API,公开调用仍用 extract / extract_batch,且 DocumentExtractor 上没有 as_sync_extractor() 方法。三、HTML 大小上限为 MAX_HTML_SIZE_BYTES = 2 * 1024 * 1024(2 MB),源于栈约束。
构建配置:crates/xberg-wasm/Cargo.toml 中 crate-type = ["cdylib"];根 Cargo.toml 的 [profile.release.package.xberg-wasm] 设 opt-level = "z",codegen-units = 1 来自全局 [profile.release]。API 形态为生成的 async wasm-bindgen 函数包裹同步内部实现,例如 extract(input, config)。WASM 专属代码用 #[cfg(target_arch = "wasm32")] 门控,插件 trait 实现使用双分支 cfg_attr async_trait 形式。