九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
さてさて、私の開発メインはPHP
(Laravel)+ JavaScript
(Vue.js)で、もしこれらに不向きな部分があればPython
を使うという形になっています。
実際この3つがあれば(私の)業務的に困ることはほぼないのですが、根っからのプログラム好きですので、「別のテクノロジーもかじっておきたい」欲があったりします。
そこで注目したのが、
Rust言語
です。
なぜ「Rust言語」かというと、ブラウザのJavaScript
を高速化することができる「WebAssembly」をつくることができるからなんですね。
※ WebAssembly
については、過去記事がありますのでぜひご覧ください。(前回はC言語を使いました)
📝 参考ページ: 入門!WebAssemblyを試してみた
つまり、Rust
言語はウェブ開発に関連させることもできるわけです。
そこで❗
今回はRust
言語でWebAssembly
をつくって(ブラウザの)JavaScript
で使えるようにしてみたいと思います。
ぜひ何かの参考になりましたら嬉しいです😊✨
「WebAssemblyは
ゲーム開発でも
使われるらしいですよ」
目次
Rust 言語をインストールする
まずはRust
言語のインストールですが、こちらは本家のインストールページ
を参考にしてみてください。(すみません、Linux
環境なので・・・💦)
なお、Ubuntu
の場合は以下のコマンドを実行すれば自動的に完了します。(途中オプション選択がありますが、default
のものでOKです)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Rust開発環境の準備をする
プロジェクトをつくる
コマンドライン(黒い画面のやつです)でRust
開発をするためのフォルダに移動し、以下のコマンドを実行してください。
cargo new --lib hello-wasm
※ なお、Cargo
とはnpm
やcomposer
のようなパッケージ・マネージャです。私の環境では、rust
言語をインストールすると自動的にcargo
コマンドが使えるようになっていました 👍
実行すると、hello-wasm
フォルダが作成され、中にいろいろと必要なファイルが入っていますが、実際にコーディングするのはsrc/lib.rs
です。
※ なお、このファイルには初期状態でサンプルコードが書かれていますが、不要ですので全て消してしまって問題ないです。
Cargoにビルドパッケージをインストールする
WebAssembly
をつくるためのCargo
パッケージをインストールします。
cargo install wasm-pack
少し時間はかかりますが、特に途中で何もすることはないです😊✨
コンフィグ設定をする
Cargo
プロジェクトの設定ファイルはCargo.toml
というファイルの中に書き込みます。
以下のように変更してください(太文字の部分を追加しました)
Cargo.toml
[package] name = "hello-wasm" version = "0.1.0" edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] crate-type = ["cdylib"] [dependencies] wasm-bindgen = "0.2"
WebAssembly 用のコードをつくる
では、実際にRust
でWebAssembly
用のコードをつくってみましょう。
src/lib.rs
use wasm_bindgen::prelude::*; #[wasm_bindgen] extern { pub fn alert(s: &str); } #[wasm_bindgen] pub fn greet(name: &str) { alert(&format!("{} さん、こんにちは!", name)); }
中身としてはシンプルに名前をゲットしたらalert()
で表示するだけのものです。
Rust をビルドしてWebAssembly をつくる
では、先ほどのコードをWebAssembly
化してみましょう。
以下のコマンドを実行してください。
wasm-pack build --target web
これで、pkg
フォルダの中にWebAssembly
が作成されているはずです。
JavaScriptで使ってみる
では、作成されたWebAssembly
をJavaScript
で使ってみましょう❗
WebAssemblyを設置する
今回は、Laravel
内で使う手順ですが、別の環境でも同様になります。
まずは先ほどのpkg
フォルダをブラウザからアクセスできる場所に設置します。
つまり、Laravel
だとpublic
フォルダですね。
今回は「/public/wasm/hello-wasm/pkg」として設置しました。
WebAssembly を使うコードをつくる
では、Laravel
に以下のビューを作ります。
resources/views/wasm.blade.php
<html> <body> <!-- WebAssembly用のコード --> <script type="module"> import init, {greet} from "./wasm/hello-wasm/pkg/hello_wasm.js"; init() .then(() => { window.greet = greet; }); </script> <!-- 通常の JavaScript --> <script> window.onload = () => { console.log(typeof greet); // ここではまだ読み込まれていない可能性がある let timer = setInterval(() => { if(typeof greet === 'function') { greet("山田太郎"); clearInterval(timer); } }, 100) }; </script> </body> </html>
ここで、少し通常のJavaScript
とは違う部分がでてきています。
<script type="module"> // 省略 </script>
の部分ですね。
これは私も実際に使ったのは初めてですが、コードの通り「モジュール」を使うコードになります。
つまり、今回の例で言うと、init()
でWebAssemblyの準備をし、それが完了して初めて Rust 言語で書いたコードが実行できるということになります。
そのため、ページが表示されてすぐ実行しても関数が準備されていない場合があるので、以下の部分でgreet()
が関数として使えるかどうかをチェックしているわけです。
if(typeof greet === 'function') { // 👈 ホントに関数なの??をチェック // 省略 }
そして、このビューをLaravel
のルートに登録すれば完成です。
routes/web.php
Route::get('wasm_test', fn() => view('wasm'));
テストしてみる
では、すぐ終わってしまいますが実際にテストしてみましょう。
「http://******/wasm_test」にアクセスします。
はい❗
Rust
言語で書いたalert()
が実行されました。
成功です😊✨
企業様へのご提案
WebAssembly
を使うと以下のようなメリットがあります。
- バイナリコードの実行なので高速に処理ができる。(つまり、現在ブラウザでの処理に時間がかかっている部分を高速化できる可能性がある)
- WebAssembly は一度作っておくと他のシステムにも組み込むことができるので、「使い回し」ができる
- まだ発展途上のようですが Wasmer という技術を使うとPHPなど様々な言語からも WebAssembly を利用できるようになる(※1)
※1: 参考ページ: Wasmer
もし上記のような機能をご希望でしたら、ぜひお気軽にお問い合わせからご連絡ください。どうぞよろしくお願いいたします。m(_ _)m
おわりに
ということで、今回ははじめて「Rust言語」を使い、WebAssembly
をつくってみました。
なお、実は当初もう一つ注目していた「Go言語」でWebAssembly
を作るつもりでした。
結果としてWebAssembly
化するところまで成功したのですが、一点大きなデメリットがあることに気が付きました。
それが、「ファイルサイズ」でした。
Go
で作ったWebAssembly
は今回のようなシンプルなコードだけでも2MBぐらいのファイルサイズになってしまいます。
これでは最大の目的「高速化」のために、長いロード時間が発生することになり、「冷たいドリンクを買うために、汗かいて遠くまで歩いていく😂」ような状態になるため、今回は見送ることにしました。
ただ、Go
はこれからのメインストリームになるだろうと言われる産業の会社が多く採用してるとのことで(Youtuber
でもある酒井潤さんが動画内でおっしゃってました)、また別の部分で注目してみたいと思います。
ぜひ皆さんも試してみてくださいね。
ではでは〜❗
「コーヒー飲むと
気分悪くなるように
なっちゃいました
(飲みすぎ…💦)」