部署 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”策略类似,这种部署方法不需要任何进一步的后处理。 可以像任何其他 Node 模块一样 import
生成的 JS shim。
请注意,此方法需要具有 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
。 有关此内容的更多信息即将推出!