部署 Rust 和 WebAssembly

目前,将 Rust 和 WebAssembly 部署到 Web 或其他位置并非易事。本页面旨在作为各种已知选项的文档,如果文档过时,欢迎随时提交 PR 来更新!

这里的部署和集成方法主要与 --target 标志相关。

摘要
bundler 适用于在 Webpack 等打包器中加载
web 可以直接在 Web 浏览器中加载
nodejs 可以通过 require 作为 Node.js CommonJS 模块加载
deno 可以使用 Deno 模块的导入进行加载
no-modules 类似于 web,但较旧且不使用 ES 模块
experimental-nodejs-module 可以通过 import 作为 Node.js ESM 模块加载。

打包器

--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 及以上版本。

Node.js 模块

--target experemintal-nodejs-module

如果要将 WebAssembly 作为 JavaScript 模块部署到 Node.js 中,则需要将 --target experimental-nodejs-module 标志传递给 wasm-bindgen

与“node”策略一样,这种部署方法不需要任何进一步的后处理。生成的 JS shim 可以像任何其他 Node 模块一样被 import

请注意,此方法需要支持 WebAssembly 和模块的 Node.js 版本,目前为 Node 12 及以上版本。

目前为实验性功能。目标预计在稳定之前会发生更改。

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。更多相关信息即将推出!