部署 Rust 和 WebAssembly
目前,将 Rust 和 WebAssembly 部署到 Web 或其他位置并非易事。本页旨在作为各种已知选项的文档,并且始终欢迎 PR 来更新此文档,以防它过时!
此处介绍的部署和集成方法主要与 `--target` 标志相关联。
值 | 摘要 |
---|---|
bundler | 适用于在 Webpack 等捆绑器中加载 |
web | 可以直接在 Web 浏览器中加载 |
nodejs | 可以通过 `require` 作为 Node.js 模块加载 |
deno | 可以使用 Deno 模块中的导入进行加载 |
no-modules | 类似于 `web`,但更旧,不使用 ES 模块 |
捆绑器
--target bundler
`wasm-bindgen` 的默认输出,或 `bundler` 目标,假设 wasm 模块本身是本地的 ES 模块。但是,此模型目前在任何 JS 实现中都没有本地实现。因此,要使用 `wasm-bindgen` 的默认输出,您将需要某种形式的捆绑器。
注意:选择此默认输出是为了反映 JS 生态系统的趋势。虽然除了捆绑器之外的工具今天不支持 wasm 文件作为本地的 ES 模块,但它们很可能在将来会支持!
目前,唯一已知与 `wasm-bindgen` 完全兼容的捆绑器是 webpack。大多数 示例 使用 webpack,您可以查看 在线的 hello world 示例,以了解必要的 webpack 配置详细信息。
无需捆绑器
--target web
或 --target no-modules
如果您没有使用捆绑器,但仍在 Web 浏览器中运行代码,`wasm-bindgen` 仍然支持!对于这种情况,您需要使用 `--target web` 标志。您可以在文档中查看 完整示例,但此输出的重点是
- 编译时,您需要将 `--target web` 传递给 `wasm-bindgen`
- 输出可以本地包含在网页中,不需要任何进一步的后处理。输出包含为 ES 模块。
--target web
模式无法使用 NPM 依赖项。- 您需要查看 浏览器要求,因为
wasm-bindgen
没有提供任何 polyfill。
CLI 还支持一种名为 --target no-modules
的输出模式,它类似于 web
目标,因为它需要手动初始化 wasm,并且旨在包含在无需任何进一步后处理的网页中。有关 --target no-modules
的更多信息,请参阅 无捆绑器示例。
Node.js
--target nodejs
如果您将 WebAssembly 部署到 Node.js(也许作为原生模块的替代方案),那么您需要将 --target nodejs
标志传递给 wasm-bindgen
。
与“无捆绑器”策略一样,这种部署方法不需要任何进一步的后处理。生成的 JS shim 可以像任何其他 Node 模块一样被 require
(甚至 *_bg
wasm 文件也可以被 require
,因为它也生成了 JS shim)。
请注意,此方法需要支持 WebAssembly 的 Node.js 版本,目前是 Node 8 及更高版本。
Deno
--target deno
要将 WebAssembly 部署到 Deno,请使用 --target deno
标志。然后,在 deno 中导入您的模块,请使用
// @deno-types="./out/crate_name.d.ts"
import { yourFunction } from "./out/crate_name.js";
NPM
如果您想将编译后的 WebAssembly 部署到 NPM,那么合适的工具是 wasm-pack
。有关此方面的更多信息即将发布!