部署 Rust 和 WebAssembly

目前,將 Rust 和 WebAssembly 部署到網路或其他位置並非易事。本頁旨在作為各種已知選項的文檔,並且一如既往,歡迎 PR 在過時時更新此內容!

此處的部署和整合方法主要與 --target 標誌相關。

摘要
bundler適用於在 Webpack 等打包工具中載入
web可直接在 Web 瀏覽器中載入
nodejs可透過 require 作為 Node.js CommonJS 模組載入
deno可使用來自 Deno 模組的導入載入
no-modulesweb 類似,但較舊且不使用 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。更多相關資訊即將推出!