起こった事
Rustで書いたプログラムをwasm-pack
を用いてビルドし、出力されたファイルをJS側から
import wasm from "path/to/wasm/output/app_name_bg.js;
として読み込んでいた。
ブラウザ上では動いたがElectronでも同じやり方をするとapplication/wasmっていうMIMEタイプは間違っている
とエラーを吐きwasmを読み込めなかった
結論
Rustで使用しているwasm-bindgen
と同じバージョンのwasm-bindgen-cli
をインストールする。
$ cargo install -f --version 0.2.64 wasm-bindgen-cli
ターゲットにwasm32-unknown-unknown
を指定してビルド
$ cargo build --target wasm32-unknown-unknown --release
wasm-bindgenコマンドを用いてwasmを任意のディレクトリに出力
$ wasm-bindgen target/wasm32-unknown-unknown/release/app_name.wasm --out-dir path/to/wasm/output --target web
Electronのindex.html
内header
タグ内に以下のコードを追加
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline' 'unsafe-eval'; object-src 'self'"/>
レンダープロセス側のJSで以下のように書く事でwasmを呼び出せる。
import { MyClass, MyFunc, default} from 'path/to/wasm/output/app_name.js';
let my_class; // 他の部分でもクラスを利用したい場合
async function init() {
await default('path/to/wasm/output/app_name_bg.wasm'); // defaultはRustのコードに関わらず読み込んで呼び出す
my_class = new MyClass(); // RustでImpl/Structを公開していた場合
MyFunc(); // Rustで関数を公開していた場合
}
init();
これでElectronでwasmを読み込めるようになった。