部署 Rust 和 WebAssembly
目前將 Rust 和 WebAssembly 部署到 Web 或其他位置,不幸地,並非易事。此頁面希望能作為各種已知選項的文檔,並隨時歡迎 PR 來更新過時的資訊!
此處的部署和整合方法主要與 `--target` 標誌相關。
值 | 摘要 |
---|---|
bundler | 適用於在 Webpack 等打包工具中載入 |
web | 可直接在 Web 瀏覽器中載入 |
nodejs | 可透過 `require` 作為 Node.js CommonJS 模組載入 |
deno | 可使用來自 Deno 模組的 import 載入 |
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
。更多相關資訊即將推出!