將 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 MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...