iT邦幫忙

2024 iThome 鐵人賽

DAY 27
0
Software Development

Rust 學得動嗎系列 第 27

[Day 27] Rust 與 WebAssembly

  • 分享至 

  • xImage
  •  

今天,我們來看 Rust 在 WebAssembly (Wasm) 開發中的應用。WebAssembly 是一種可以在現代網頁瀏覽器中運行的低階語言,而 Rust 是編譯到 WebAssembly 的理想語言之一。

Rust 在 WebAssembly 開發中的優勢

  1. 高效能:Rust 編譯成的 WebAssembly 程式碼運行速度接近原生程式碼。
  2. 小型二進制檔案:Rust 可以產生相對小型的 Wasm 二進制檔案。
  3. 記憶體安全:Rust 的所有權系統確保了 WebAssembly 模組的記憶體安全。
  4. 豐富的工具生態系統:Rust 提供了許多工具來簡化 WebAssembly 開發。

使用 wasm-pack 開發 WebAssembly

wasm-pack 是一個用於建構、測試和發布 Rust 產生的 WebAssembly 的工具。

首先,建立一個新的 Rust 專案:

cargo new --lib wasm-example
cd wasm-example

Cargo.toml 中加入以下依賴:

[lib]
crate-type = ["cdylib", "rlib"]

[dependencies]
wasm-bindgen = "0.2"

src/lib.rs 中編寫以下程式碼:

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn fibonacci(n: u32) -> u32 {
    if n <= 1 {
        return n;
    }
    let mut a = 0;
    let mut b = 1;
    for _ in 2..=n {
        let temp = a + b;
        a = b;
        b = temp;
    }
    b
}

使用 wasm-pack 建構專案:

wasm-pack build --target web

在網頁中使用 Rust 編譯的 WebAssembly

建立一個 HTML 文件來使用我們的 WebAssembly 模組:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Rust WebAssembly 示例</title>
</head>
<body>
    <script type="module">
        import init, { fibonacci } from './pkg/wasm_example.js';

        async function run() {
            await init();
            const result = fibonacci(10);
            console.log('Fibonacci(10) =', result);
        }

        run();
    </script>
</body>
</html>

使用 yew 框架開發 Web 應用

Yew 是一個現代化的 Rust 框架,用於創建多執行緒的前端 Web 應用程式。

建立一個新的 Yew 專案:

cargo new yew-app
cd yew-app

Cargo.toml 中加入以下依賴:

[dependencies]
yew = "0.19"

src/main.rs 中編寫以下程式碼:

use yew::prelude::*;

#[function_component(App)]
fn app() -> Html {
    let counter = use_state(|| 0);
    let onclick = {
        let counter = counter.clone();
        Callback::from(move |_| {
            let value = *counter + 1;
            counter.set(value);
        })
    };

    html! {
        <div>
            <button {onclick}>{ "+1" }</button>
            <p>{ *counter }</p>
        </div>
    }
}

fn main() {
    yew::start_app::<App>();
}

使用 gloo 庫與瀏覽器 API 交互

gloo 是一組用於 Rust 和 WebAssembly 的模組化工具包。

Cargo.toml 中增加:

[dependencies]
gloo = "0.8"

使用 gloo 進行 HTTP 請求:

use gloo::net::http::Request;
use wasm_bindgen_futures::spawn_local;

fn fetch_data() {
    spawn_local(async {
        let response = Request::get("https://api.example.com/data")
            .send()
            .await
            .unwrap();
        let result = response.text().await.unwrap();
        log::info!("Received data: {}", result);
    });
}

效能優化技巧

  1. 使用 wee_alloc:這是一個輕量級的分配器,可以減小 Wasm 二進制檔案的大小。

    // 在 lib.rs 頂部
    extern crate wee_alloc;
    #[global_allocator]
    static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
    
  2. 啟用 Link Time Optimization (LTO):在 Cargo.toml 中增加:

    [profile.release]
    lto = true
    
  3. 使用 wasm-opt 工具:這個工具可以進一步優化 Wasm 二進制檔案。


上一篇
[Day 26] Rust 在區塊鏈和加密貨幣領域的應用
下一篇
[Day 28] Rust Rust 在系統重構與優化中的應用
系列文
Rust 學得動嗎30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言