將 Rust 代碼編譯為 WASM

来源:https://www.cnblogs.com/guojikun/p/18358337
-Advertisement-
Play Games

前言 在現代 Web 開發中,WebAssembly (WASM) 已成為一種強大的工具。它使得開發者可以在瀏覽器中運行高性能的代碼,跨越傳統的 JavaScript 性能限制。Rust 語言因其高效性和記憶體安全性,成為了編寫 WASM 模塊的熱門選擇。本文將介紹如何將 Rust 代碼編譯為 Web ...


前言

在現代 Web 開發中,WebAssembly (WASM) 已成為一種強大的工具。它使得開發者可以在瀏覽器中運行高性能的代碼,跨越傳統的 JavaScript 性能限制。Rust 語言因其高效性和記憶體安全性,成為了編寫 WASM 模塊的熱門選擇。本文將介紹如何將 Rust 代碼編譯為 WebAssembly,併在 Web 項目中使用。

1. 創建 Rust 項目

首先,我們需要創建一個新的 Rust 項目。由於我們要生成一個可以被其它語言或工具調用的模塊,因此選擇創建一個庫項目,而不是可執行程式。使用 cargo 命令可以輕鬆完成:

cargo new lib_wasm --lib

這個命令會生成一個名為 lib_wasm 的項目,其中包含一個基礎的 Cargo.toml 配置文件和一個 src/lib.rs 文件,你將在其中編寫你的 Rust 代碼。

2. 添加 wasm-bindgen 依賴項

在 Rust 中,wasm-bindgen 是一個關鍵工具,它使 Rust 和 JavaScript 之間的交互變得更加簡單。wasm-bindgen 負責生成與 JavaScript 交互所需的綁定代碼,讓你能夠直接調用 Rust 編寫的函數。

要添加 wasm-bindgen,你可以使用 cargo add 命令:

cargo add wasm-bindgen

或者,手動編輯 Cargo.toml 文件,添加如下依賴項:

[dependencies]
wasm-bindgen = "0.2"

添加 wasm-bindgen 後,Rust 編譯器會在編譯過程中生成必要的綁定文件,從而使你的 WASM 模塊可以被 JavaScript 直接調用。

3. 安裝 wasm32-unknown-unknown 目標

Rust 編譯器預設會生成適用於本地機器架構的可執行文件。要編譯成適用於 Web 的 WebAssembly 文件,我們需要添加一個特定的目標架構,即 wasm32-unknown-unknown。這是一個通用的 WASM 目標,不依賴任何特定的操作系統。

使用以下命令安裝該目標:

rustup target add wasm32-unknown-unknown

此命令會配置你的 Rust 工具鏈,使其能夠生成適用於 WebAssembly 的二進位文件。

4. 編寫 Rust 代碼

現在,你可以在 src/lib.rs 文件中編寫你希望導出的功能。例如,我們可以編寫一個簡單的函數,它接受一個名字作為參數並返回一個問候語:

use wasm_bindgen::prelude::*;

// 使用 #[wasm_bindgen] 巨集來導出函數到 JavaScript
#[wasm_bindgen]
pub fn greet(name: &str) -> String {
    format!("Hello, {}!", name)
}

在這段代碼中,我們使用了 #[wasm_bindgen] 巨集將 greet 函數導出,使其可以從 JavaScript 中調用。

5. 編譯 Rust 項目為 WASM

編寫完代碼後,我們可以將其編譯為 WASM 文件。編譯時指定目標為 wasm32-unknown-unknown,並使用 --release 選項生成優化後的構建:

cargo build --target wasm32-unknown-unknown --release

編譯完成後,生成的 .wasm 文件將存儲在 target/wasm32-unknown-unknown/release/ 目錄下。

6. 使用 wasm-bindgen 生成 JavaScript 綁定代碼

雖然編譯生成了 .wasm 文件,但直接在 JavaScript 中使用它並不方便。為此,我們需要使用 wasm-bindgen 工具生成相應的 JavaScript 綁定代碼。這將創建一個便於在 JavaScript 中調用的模塊。

首先,確保已安裝 wasm-bindgen-cli 工具。你可以通過以下命令安裝:

cargo install wasm-bindgen-cli

然後,運行以下命令生成 JavaScript 綁定文件:

wasm-bindgen --out-dir ./out --target web target/wasm32-unknown-unknown/release/lib_wasm.wasm

這會在 out 目錄中生成一系列文件,包括 .js 文件和 .wasm 文件,你可以直接在 Web 項目中使用。

7. 在網頁中使用 WASM 模塊

現在,生成的 WASM 模塊已經可以在 Web 項目中使用。你只需在 HTML 文件中導入生成的 JavaScript 綁定文件,並調用 Rust 導出的函數。例如:

<!DOCTYPE html>
<html>
<head>
    <title>Lib WASM Demo</title>
</head>
<body>
    <script type="module">
        import init, { greet } from "./out/lib_wasm.js";
        init().then(() => {
            console.log(greet("World"));
        });
    </script>
</body>
</html>

這個示例會在控制台列印出 "Hello, World!"。其中,init 函數用於初始化 WASM 模塊,而 greet 函數則調用了我們在 Rust 中定義的函數。

web 項目目錄結構如下:

index.html
out/
    ├── lib_wasm_bg.wasm
    ├── lib_wasm_bg.wasm.d.ts
    ├── lib_wasm.d.ts
    └── lib_wasm.js

out 目錄中包含了生成的 WASM 文件以及相應的 JavaScript 綁定文件,index.html 是一個簡單的網頁,用於測試和展示你的 WASM 模塊。

結語

通過這套流程,你可以輕鬆地將 Rust 代碼編譯為 WebAssembly,並將其集成到 Web 項目中。Rust 的高效性和 WebAssembly 的靈活性相結合,可以為 Web 應用帶來顯著的性能提升。

本文來自博客園,作者:_zhiqiu,轉載請註明原文鏈接:https://www.cnblogs.com/guojikun/p/18358337


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在做項目的時候,Web端需要適配移動端,且部分參數需要判斷對應系統或瀏覽器。 在IOS中,因為高版本的系統Safari瀏覽器採用了Mac的內核,所以導致普通的判斷無法識別到對應系統。(userAgent.match(/(Macintosh)/) && navigator.maxTouchPoints ...
  • Mall-Vue —— 一個基於 VUE + VUEX + iView 做的一個電商網站前端項目。這個項目是一個純前端項目,實現了首頁、商品頁面、購物車等大部分常用的電商網站頁面功能。 ...
  • 本文介紹了記憶體管理的基礎知識,重點分析了棧區與堆區的區別,並詳細討論了V8引擎的記憶體管理機制,包括垃圾回收策略和優化技術。文章通過實例代碼展示了堆區和棧區的記憶體變化,並探討了v8如何通過並行、增量和併發技術優化垃圾回收性能。 ...
  • 本文主要內容: screenX 和 screenY, clientX 和 clientY / x 和 y pageX 和 pageY layerX 和 layerY 在處理滑鼠事件(MouseEvent)時,瞭解不同的坐標系是非常重要的。常見的坐標系包括屏幕坐標(screen)、客戶端坐標(clie ...
  • 一、載入問題 用高德地圖做了個進京證路線規劃的功能,官網也是有 React 代碼示例。但是吧,這個Demo有問題,地圖是能載入成功,但是其他功能再用 map 這個變數肯定不行,果不其然是null,處理也簡單,把公共變數都管理起來就行了。 const [map, setMap] = useState( ...
  • title: 使用 onBeforeRouteUpdate 組合式函數提升應用的用戶體驗 date: 2024/8/15 updated: 2024/8/15 author: cmdragon excerpt: 摘要:本文介紹如何在Nuxt 3開發中使用onBeforeRouteUpdate組合式函 ...
  • 歐陽堅持每周更新一篇高質量文章半年後的收益:收入1380.27元、電子書一本、微信技術群418人、微信好友459人、文章38篇 ...
  • 本文比較了NPM、Yarn 和 pnpm 三種包管理工具的特點,重點分析了它們在安裝速度、依賴管理、磁碟空間使用、依賴衝突處理等方面的差異,重點介紹了pnpm的依賴組織結構。 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 推薦一款基於.NET 8、WPF、Prism.DryIoc、MVVM設計模式、Blazor以及MySQL資料庫構建的企業級工作流系統的WPF客戶端框架-AIStudio.Wpf.AClient 6.0。 項目介紹 框架採用了 Prism 框架來實現 MVVM 模式,不僅簡化了 MVVM 的典型 ...
  • 先看一下效果吧: 我們直接通過改造一下原版的TreeView來實現上面這個效果 我們先創建一個普通的TreeView 代碼很簡單: <TreeView> <TreeViewItem Header="人事部"/> <TreeViewItem Header="技術部"> <TreeViewItem He ...
  • 1. 生成式 AI 簡介 https://imp.i384100.net/LXYmq3 2. Python 語言 https://imp.i384100.net/5gmXXo 3. 統計和 R https://youtu.be/ANMuuq502rE?si=hw9GT6JVzMhRvBbF 4. 數 ...
  • 本文為大家介紹下.NET解壓/壓縮zip文件。雖然解壓縮不是啥核心技術,但壓縮性能以及進度處理還是需要關註下,針對使用較多的zip開源組件驗證,給大家提供個技術選型參考 之前在《.NET WebSocket高併發通信阻塞問題 - 唐宋元明清2188 - 博客園 (cnblogs.com)》講過,團隊 ...
  • 之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...
  • 在軟體行業,經常會聽到一句話“文不如表,表不如圖”說明瞭圖形在軟體應用中的重要性。同樣在WPF開發中,為了程式美觀或者業務需要,經常會用到各種個樣的圖形。今天以一些簡單的小例子,簡述WPF開發中幾何圖形(Geometry)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 在 C# 中使用 RabbitMQ 通過簡訊發送重置後的密碼到用戶的手機號上,你可以按照以下步驟進行 1.安裝 RabbitMQ 客戶端庫 首先,確保你已經安裝了 RabbitMQ 客戶端庫。你可以通過 NuGet 包管理器來安裝: dotnet add package RabbitMQ.Clien ...
  • 1.下載 Protocol Buffers 編譯器(protoc) 前往 Protocol Buffers GitHub Releases 頁面。在 "Assets" 下找到適合您系統的壓縮文件,通常為 protoc-{version}-win32.zip 或 protoc-{version}-wi ...
  • 簡介 在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴硬編碼的地址。以前如果你搜 .NET Service Discovery,大概率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Micr ...
  • ZY樹洞 前言 ZY樹洞是一個基於.NET Core開發的簡單的評論系統,主要用於大家分享自己心中的感悟、經驗、心得、想法等。 好了,不賣關子了,這個項目其實是上班無聊的時候寫的,為什麼要寫這個項目呢?因為我單純的想吐槽一下工作中的不滿而已。 項目介紹 項目很簡單,主要功能就是提供一個簡單的評論系統 ...