手元でWebAssemblyを動かす方法【ローカルWebサーバー構築】

WebAssemblyに興味があってとりあえず動かしてみたいという方向けの内容になります。
ローカル環境で即席のWebサーバーを作りWebAssemblyサンプルを動かす手順について紹介します。

WebAssemblyを動かすのにサーバーが必要な理由

MozzilaのMDNが作成したサンプルを以下からダウンロードできます。

https://github.com/mdn/WebAssembly-examples/

サンプルからわかる通り、WebAssembly(wasm)はhtmlやjsファイルと一緒に利用します。

ただ、htmlやjsファイルとは異なり、ローカルファイルとしてブラウザで開いても
正しく読み込むことができません。

先ほどのサンプルにある、wasmを利用しているhtmlファイルを開くと
次のエラーがブラウザで発生します。

URL scheme must be "http" or "https" for CORS request

エラー内容は「httpもしくはhttps経由でWebAssemblyを利用してください」ですね。
このため、手元でWebAssemblyを動かすにはWebサーバ-が必要になります。

Webサーバ構築の準備【nodeとexpressのインストール】

それではwebサーバーを作ってみましょう。今回はnodeを用いてサーバーを構築します。
まずは土台となるnodeのインストールはこちらから

https://nodejs.org/ja/

node --version

でバージョンが表示されればWebサーバの土台は完成です。

つぎに、expressというWebサーバーを簡単に作るツールを
nodeにインストールしておきます。

npm install -g express-generator

nodeと同様にインストールできたかの確認をバージョン表示でします。

npx express --version

Webサーバー構築

準備が整いましたのでWebサーバーを作成します。
作成したいディレクトリで以下のコマンドを打ちます。

npx express --no-view

publicフォルダが生成されていればOKです。
このpublicフォルダがwebサーバー 127.0.0.1 のドキュメントルートになります。

そして次のコマンドで必要なモジュールを生成しましょう。

npm install

WebAssemblyにはapplication/wasm有効化が必要

ここで注意点の紹介です。
生成されたpackage.jsonでバージョンを確認してください。

“express” : “X.XX.X”

もし「4.17.1」より低いバージョンであれば

“express” : “^4.17.1”

と変更してください。
バージョンを変更し終わったら

npm update

で適用します。

何故この作業をするかといいますと、
wasmがcontent-typeとしてapplication/wasmを必要とするためです。

今回使用しているexpressのバージョンが4.17.1未満では、
デフォルトでapplication/wasmが有効になっておらず、
ブラウザ側でエラーが発生しWebAssemblyが動きません。

その場合ブラウザ側で次のようなエラーがでます。

Failed to execute 'compile' on 'WebAssembly': Incorrect response MIME type. Expected 'application/wasm'.

そこで、バージョンを4.17.1以上にすることで、application/wasmを利用できるようにしました。

もし、生成されたexpressのバージョンが4.17.1以上であればこの作業は不要です。

Webサーバーの起動

npm start

コマンドを打ちましたら、「http://127.0.0.1:3000/」にアクセスしてみましょう。
expressと表示されていれば無事サーバーが動いています。

もしポートが使用されているとなりましたら
bin/www ファイルの
var port = normalizePort(process.env.PORT || ‘3000’);
を見てください。
‘3000’となっている箇所を変更しましょう。

サンプルを配置し動かしてみる

サーバーが出来あがりましたのでサンプルを配置して実際に動かします。
こちらからソースコードをダウンロードします。

https://github.com/mdn/WebAssembly-examples/

ダウンロードできましたら、js-api-examplesのディレクトリを
そのままpublicフォルダにコピーし、ブラウザからアクセスします。

http://127.0.0.1:3000/js-api-examples/index.html

ブラウザのコンソールに数字が出力されていることが確認できましたでしょうか。
できていればWebAssemblyを動かすことに成功です。

おわりに

以上で、WebAssemblyを手元で動かすための環境構築は終了になります。
とりあえずサンプル動かしてみたいといった方の参考になればうれしいです。

他にもWebAssemblyのサンプルはほかにもありますので、いろいろ配置して動かして遊べますね。

WebAssemblyは2019年に策定と日が浅いですけども、
jsよりもパフォーマンスが良くなる可能性を秘めているため、今後の利用が楽しみです。

では。