スポンサーリンク
Rust

📝 VS Code で Rust/WASM の引数つき Hello(文字列)デモを作ってみた

Rust
この記事は約5分で読めます。

(wasm-bindgen の仕組みも解説)

前回は Rust/WASM の最小デモとして「Hello, WASM!」を表示するところまで作りました。 今回はその続きとして、JavaScript から文字列を渡し、Rust/WASM 側で加工して返すデモを VS Code 上で作ってみました。

このステップは、Rust/WASM を使った Web アプリ開発の基礎となる 「JS → WASM → JS」のデータの流れを理解するために最適です。

1. VS Code で Rust コードを編集する

(まずは実際に動くものを作る)

前回作成した hello_wasm プロジェクトの src/lib.rs に、 新しい関数 hello_name() を追加します。

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn hello() -> String {
    "Hello, WASM!".to_string()
}

#[wasm_bindgen]
pub fn hello_name(name: String) -> String {
    format!("Hello, {}!", name)
}

✔ ポイント

  • #[wasm_bindgen] を付けることで JS から呼び出せるようになります
  • String を受け取り、String を返すだけのシンプルな関数です
  • wasm-bindgen が JS ↔ Rust の文字列変換を自動で行います

2. wasm-bindgen とは何か

(Rust と JavaScript をつなぐ橋渡し)

ここで、先ほど使った #[wasm_bindgen] の意味を整理します。

Rust を WebAssembly にコンパイルしただけでは、JavaScript と直接やり取りすることはできません。 そこで必要になるのが wasm-bindgen です。

✔ wasm-bindgen の役割

  • Rust の関数を JavaScript から呼び出せるようにします
  • JavaScript の値を Rust に渡せるようにします
  • Rust の値を JavaScript に返せるようにします
  • WASM のメモリ管理を安全に扱えるようにします
  • wasm-pack と連携して JS ラッパーコード(hello_wasm.js)を生成します

つまり、Rust と JavaScript の間の型変換・関数公開・メモリ管理をすべて肩代わりしてくれるライブラリです。

今回の「引数つき Hello」が簡単に作れるのも、wasm-bindgen が内部で 文字列の受け渡しを自動で処理してくれているためです。

3. wasm-pack でビルドする

VS Code のターミナルで以下を実行します。

wasm-pack build --target web

4.デモ用フォルダを作成する(VS Code 上で)

wasm/
├── index.html
├── hello/
└── hello_name/
    └── index.html

5. HTML(hello_name/index.html)を作成する

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Hello Name (WASM)</title>
</head>
<body>
    <h1>引数つき Hello (Rust/WASM)</h1>

    <input id="name" placeholder="名前を入力" />
    <button id="run">挨拶する</button>

    <p id="msg"></p>

    <script type="module">
        import init, { hello_name } from "../pkg/hello_wasm.js";

        async function main() {
            await init();

            const input = document.getElementById("name");
            const button = document.getElementById("run");
            const msg = document.getElementById("msg");

            button.addEventListener("click", () => {
                const name = input.value || "WASM";
                msg.textContent = hello_name(name);
            });
        }

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

6. トップページにカードを追加する

<a href="./hello_name/index.html" class="card">
    <h2>Hello Name</h2>
    <p>文字列を Rust/WASM に渡して挨拶を返します。</p>
</a>

7. ロリポップにアップロードする

  • SSH FS → 保存するだけで反映
  • 手動 → hello_name/pkg/ をアップロード
/WASM/
  ├── index.html
  ├── hello/
  │     └── index.html
  ├── hello_name/
  │     └── index.html
  └── pkg/
        ├── hello_wasm_bg.wasm
        ├── hello_wasm_bg.wasm.d.ts
        ├── hello_wasm.d.ts
        └── hello_wasm.js

ブラウザで /WASM/ にアクセスすると、トップページから各デモを選択できます。

8. 動作確認

https://wasm.kajiblo.com/hello_name/
  • 名前を入力
  • 「挨拶する」をクリック
  • Rust/WASM が Hello, {name}! を返す

✨ まとめ

  • まず VS Code で Rust コードを追加
  • その後 wasm-bindgen の役割を理解すると流れがつかみやすい
  • wasm-bindgen が JS ↔ Rust の橋渡しを担当
  • 文字列の受け渡しも自動で処理
  • VS Code だけで簡単にデモを追加できる

コメント

タイトルとURLをコピーしました