GO→WebAssembly→React→Cordova


前回やった内容で「golang webassembly」と検索してもあまり情報がなかったけど、ReactやCordovaとWebAssemblyの組み合わせは全く出てこなかった。

React+Cordovaでアプリを作るテストもしていたので、せっかくだから手探りでアプリ化までしました。

今回はその備忘録です。

 

GO→WebAssembly

まずは前回に倣ってGOからwasmファイルを作ります。

追加要素で返値としてcallbackを呼び出してます。

このwasmファイルを使って次に進みます。

WebAssembly→React

publicにwasm_exec.jsを置いてindex.htmlで読み込みます。

 

コンストラクタでgoを読み込むためのクラスをstateに入れます。

 

resolveLocalFileSystemURLを利用してArrayBufferからResponse化します。

window.test(" hello from js ");でwasm側の関数が呼ばれます。

 

確認用にcallback関数も用意しておきます。

 

wasm内の関数が呼び出され、コールバックでalertが実行されます。

React→Cordova

Reactでアクセスしたファイルは上の時点では存在しません。

ビルドしたソース一覧にwasmファイルを追加する必要があります。

今回の例だとwww/staticにmediaというフォルダを作成してそこにtest.wasmを置いています。

単体で使うならreactのpublic内に配置するとビルド時にwww直下に配置されるので、それを読み込むようにしてもいいかもしれません。

エラーリスト

CompileError: AsyncCompile: Wasm decoding failed: expected xxx

誤ったファイル読み込み方法(File形式のままやBinaryStringで読み込んだ)でコンパイルエラーになりました。

 

RangeError: WebAssembly Instantiation: Out of memory: wasm memory

テスト用端末(CP-L45s/Andorid6)で発生してました。

色々調べても原因がわからず予備端末(P9 lite)で実行してみたら発生しませんでした。どちらもRAM2Gなのでメモリ不足かどうかよくわからない。

原因を探っているとGOのビルドに問題がありそう。

wamsというツールを使ってメモリ量を減らすとOut Of Memoryは出なくなったけど関数が呼び出せませんでした(P9 liteでは依然問題なく動く)。

所感

問題はまだ残ってますがとりあえず動かすことはできそうだとわかりました。

色々試してみて実用が可能そうなら本格的に使ってみたいです。


コメントを残す

メールアドレスが公開されることはありません。