這是與 Rust 及 WebAssembly 協作的尚未發佈的說明文件,已發佈的說明文件可以在 Rust 和 WebAssembly 說明文件網站 取得。在此記錄的功能可能不會在 Rust 及 WebAssembly 工具已發行的版本中提供。

您應該瞭解的工具

這是一份精選的令人讚嘆工具清單,當您進行 Rust 及 WebAssembly 開發時您應該瞭解這些工具。

開發、建置和工作流程協調

wasm-pack | 程式庫

wasm-pack 致力於成為一套建立 Rust 生成的 WebAssembly 並與其協作的一站式服務,您可能想在網路或 Node.js 上與 JavaScript 進行互操作。wasm-pack 能協助您建置並發佈 Rust 生成的 WebAssembly 到 npm 程式庫,以用於與您已經使用的任何其他 JavaScript 套件中的工作流程一同使用。

最適化和處理 .wasm 二進位檔

<code>wasm-opt</code> | 倉庫

<code>wasm-opt</code> 工具會讀取 WebAssembly 作為輸入,執行轉換、最佳化和/或調試,然後輸出轉換後代 WebAssembly。透過 <code>rustc</code> 編譯 LLVM 產生的 <code>.wasm</code> 二進位檔,通常會產生同時較小且執行速度較快的 <code>.wasm</code> 二進位檔。此工具是 <code>binaryen</code> 專案的一部份。

<code>wasm2js</code> | 倉庫

<code>wasm2js</code> 工具會將 WebAssembly 編譯成「幾乎是 asm.js」。這非常適用於支援未實現 WebAssembly 的瀏覽器,例如 Internet Explorer 11。此工具是 <code>binaryen</code> 專案的一部份。

<code>wasm-gc</code> | 倉庫

一個小型工具,可用來對 WebAssembly 模組進行垃圾回收,並移除所有不需要的匯出、匯入、函式等等。這在實質上對 WebAssembly 來說是一個 <code>--gc-sections</code> 連接器標記。通常會自動啟用於 LTO 建置事項。

基於兩個原因,通常不需要自行使用此工具

  1. <code>rustc</code> 現在有一個較新的 <code>lld</code> 版本,支援 <code>--gc-sections</code> 標記。這在實質上會自動啟用於 LTO 建置事項。</p>
  2. <code>wasm-bindgen</code> CLI 工具會自動執行 <code>wasm-gc</code>。

<code>wasm-snip</code> | 倉庫

<code>wasm-snip</code> 會使用一個 <code>unreachable</code> 指令取代 WebAssembly 函式的本體。

也許你清楚知道某些函式在執行時永遠不會被呼叫,但編譯器在編譯時卻無法證明此事嗎?那就剪掉它!然後再次執行 <code>wasm-gc</code>,所有該函式傳遞性呼叫的函式(這些函式在執行時也永遠不會被呼叫)也會被移除。

這很適用於在非偵錯的製作建置事項中,強制移除 Rust 的恐慌基礎架構。

inspecting <code>.wasm</code> 二進位檔

<code>twiggy</code> | 倉庫

<code>twiggy</code> 是 <code>.wasm</code> 二進位檔的程式碼大小剖析器。它會分析二進位檔的呼叫圖,以回答下列問題

  • 為何第一時間將此函式納入二進位檔中?亦即,哪些匯出函式傳遞性呼叫了它?
  • 此函式的保留大小為何?亦即,如果我將此函式及移除該函式後成為死程式碼的所有函式移除,將可以節省多少空間。

使用 twiggy 讓你的二進位檔更精簡!

wasm-objdump | 儲存庫

列印 .wasm 二進位檔及其各區段的底層明細。也支援反組譯成 WAT 文字格式。它就像 WebAssembly 的 objdump。這是 WABT 專案的一部分。

wasm-nm | 儲存庫

列出 .wasm 二進位檔中定義的已匯入、已匯出和私有函式符號。它就像 WebAssembly 的 nm