WebAssemblyというキーワードは聞いたことがあるでしょうか。

WASMと略されることもあります。Webブラウザ上でバイナリファイルを実行する技術です。JavaScriptに比べると数倍高速に動作します。

また、バイナリファイルなのでコードを見られる心配もありません。

今回はMonaca IDEでWebAssemblyを利用する方法を紹介します。

※ この記事で紹介する機能は、Monaca有料プランでのみ利用できる機能が含まれています。

対象はPWA

注意点として、MonacaアプリではなくPWAを対象としています。

Monacaアプリの場合、CORSを許可したサーバ上からWebAssemblyのバイナリファイルを読み取ることで実行可能になりますが、iOSの場合は落ちてしまうようです。PWAとしてデプロイする場合は問題ありませんので、今回はPWAのみを対象とします。

Monaca IDE上で扱える言語について

WebAssemblyは技術であって、プログラミング言語ではありません。

WebAssemblyに変換できるプログラミング言語としては、C/C++/Rustが初期として知られていましたが、現在ではGo/C#/Swift/Kotlinなども対応しています。

LLVMと呼ばれる中間コードに変換できればWebAssembly化できると言われていますので、他のプログラミング言語でも利用できるでしょう。

現在対応しているプログラミング言語でMonaca IDE上で動かせるものはAssemblyScriptになります。

AssemblyScriptは、TypeScriptからWebAssemblyを生成します。生成時にNode.jsだけあれば良いので、他の言語のようにビルド環境を整えずに使えるのが利点です。もちろん、Monaca IDEではなくLocalKitやCLIを使う場合には好きな言語でWebAssembly開発が行えるでしょう。

ベースプロジェクトはPWAテンプレート

今回は、「最小限のPWAテンプレート」を選択してください(サンプルアプリケーションの中にあります)。

AssemblyScriptのインストール

AssemblyScriptはMonaca IDEのターミナル上でインストールします。

ターミナル機能は、Proプラン以上が必要になりますので注意してください。

npm install --save-dev assemblyscript

これでプロジェクト内で、 asc コマンドが使えます。

コードを試す

まず ~/project 以下に ts というフォルダを作ります(ここにAssemblyScriptのファイルを入れます)。

mkdir ts

そしてファイルを作ります。

touch ts/add.ts

ファイルツリーを更新した後、このファイルをMonaca IDEで開きます。

コードは簡単なもので、与えられた引数二つを足すだけです。

export function add(a: u32, b: u32) : u32 {
  return a + b;
}

コンパイルする

そしてAssemblyScriptを使ってコンパイルします。

npx asc -o www/add.wasm ts/add.ts

これで www/add.wasm ファイルが生成されていれば成功です。

この .wasm という拡張子のファイルがWebAssemblyファイルになります。ファイルの中身を見ると分かりますが、バイナリになっています。

実行する

ではこの add.wasm を実行するコードを index.html に記述します。

mod.instance.exports.add でWebAssembly内のadd関数を取り出せます。
そして引数を与えて実行します。

WebAssembly.instantiateStreaming(fetch("add.wasm"), {}).then(mod => {
  const add = mod.instance.exports.add;
  const result = add(1, 2);
  console.log(result);
});

実行する

プレビューパネルで、プロジェクトを表示すると、WebAssemblyが実行されているはずです。

今回は開発者ツールのコンソールにログが出ていれば問題ありません。

簡単なコードのため、インスペクターに「3」とのみ表示されています。

まとめ

AssemblyScriptを使うことでTypeScriptを使ってJavaScriptライクにWebAssembly開発を行えるようになります。

ループ処理や数値計算処理であればJavaScriptの数十倍〜数百倍の速度で実行できます。

高速でコードが漏洩する心配のないWebアプリケーション開発のためにもぜひWebAssemblyを活用してください。