見出し画像

RustでWebassembly作成、javascriptから読込む手順 #Rust #Webassembly

■ 概要:

Rust のインストール等は省略しますが、
Webassembly の作成や、JSから呼び出す例となります。

■ 参考

https://developer.mozilla.org/ja/docs/WebAssembly/Rust_to_wasm

https://qiita.com/kamykn/items/371cba5487d3c7cea8aa

■ 環境

Rust
rustc 1.46.0
cargo 1.46.0
wasm-pack
ubuntu 16

■ 準備など

・wasm-pack 追加

curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
cargo install cargo-generate

・ubuntu 16 の場合、openssl エラーで失敗したので。libssl-dev 追加しました

sudo apt-get install libssl-dev

・NGの場合、pkg-config も追加

sudo apt-get install pkg-config

cargo generate --git https://github.com/rustwasm/wasm-pack-template

 Project Name: プロジェクト名を入力 (例: wasm1)

npm install npm@latest -g

npm 更新。

・wasm-pack で、ビルド

wasm-pack build

pkg/ 下に、.wasm( Webassembly ) 等が、出力されます。

■ webpackで、読み込む準備

npm init wasm-app www

www/ が作成されます。

・webpack は、下記で操作できます
起動:
npm run start
ビルド:
npm run build

・一旦, npm install します 。webpack追加等

cd www

npm install

・npm link を /pkg で実行

cd pkg
npm link

ここで、書き込みエラーの場合、sudo npm link
で、root権限で実行します

・www に、移動して npm link

npm link wasm1

node_modules/ に。リンク追加されます

・www/index.js の修正、

import * as wasm from "wasm1";
wasm.greet();

作成した、WASMよみこみ greet() 関数を呼ぶ

・webpack起動

cd www
npm run start 

http://localhost:8080/ で、起動でき
alert() 画面が、表示されます。


画像1

・上記の wasm.greet() が呼び出す, alertが表示されるようですね

■ webpackを使用しない場合

上記、webapack の場合で、手順が多めでしたので。HTMLから呼ぶ方法も。見つけましたので
追記します。python3 のサービスを使います。

・参考
https://rustwasm.github.io/docs/wasm-bindgen/examples/without-a-bundler.html

・build, --target=web に変更

wasm-pack build --target=web

・ index.html 、追加
  script type="module" 、で読めるらしいです

<!DOCTYPE html>
<html>
 <head>
   <meta charset="utf-8">
   <title>Hello wasm-pack!</title>
 </head>
 <body>
   <!-- Note the usage of `type=module` here as this is an ES6 module -->
   <script type="module">
     import init, * as wasm from './pkg/wasm1.js';
     async function run() {
       await init();
       wasm.greet();
     }
     run();
   </script>    
 </body>
</html>       

・サーバ起動

python3  -m http.server 8082



いいなと思ったら応援しよう!