用途:针对 FMC 地理计算密集的 React 应用,指导在何时以及如何用 Rust/WASM 替代 JavaScript 几何库 Turf。适用场景包括:Turf/JS 几何过慢(先做性能分析,主线程阻塞超过约 100ms);OSM 解析、地图模型构建、等时圈、空间索引、图路由;数千要素、重复几何操作或大规模多边形布尔运算;新增或评审 wasm-pack crate、wasm.ts 边界或 Vite WASM 插件。单要素小 GeoJSON 操作、原型阶段的交互编辑反馈仍应继续使用 Turf。
主要能力与 crate 选择:几何与 GeoJSON 用 geo、geojson;空间索引用 rstar;道路路由用 fast_paths;图算法用 petgraph;OSM 转图用 osm-reader(a-b-street fork);轨迹吸附道路用 route-snapper-graph;多边形布尔运算用 i_overlay;等值线用 contour;序列化地图模型用 bincode 加 serde;矢量文件 I/O 用 flatgeobuf、geozero。大批量几何(非路由/OSM)推荐 geoarrow-wasm,而非自研。
使用方式:每个应用一个 crate,按计算内容命名(如 geo-isochrone、route-buffer)。lib.rs 只暴露 #[wasm_bindgen] 接口,内部模块放纯地理逻辑,便于不依赖 WASM 测试。JS 侧通过唯一的 wasm.ts 包装导出,React 组件与 hooks 只导入 wasm.ts,绝不直接导入 pkg/ 或 .wasm。边界传 GeoJSON 字符串或 bincode Uint8Array,JS 侧解析后用 Zod 校验;API 边界坐标统一为 WGS84、[lng, lat]。持久计算状态放 Rust,UI 状态放 React(Zustand、URL 或 useState)。构建使用 wasm-pack(--target web)、vite-plugin-wasm 和 wasm32-unknown-unknown 目标;WASM 相关依赖包括 wasm-bindgen、serde-wasm-bindgen、wasm-bindgen-futures、console_error_panic_hook、getrandom(features=["js"])、web-time。
限制与规则:不得在 *.server.ts、服务器 loader 或 createServerFn 中初始化 WASM;WASM 仅客户端运行,需在 hydration 后懒初始化;共享模块不得顶层导入 .wasm;Vite SPA 与 TanStack Start 的集成方式分别参考对应指南。是否迁移应以性能剖析结果为准,未证实需要前保留 Turf 回退路径。具体版本、价格或完整配置细节资料暂未提供。