100日後にRustをちょっと知ってる人になる: [Day 22]wasm-pack
Day 22 のテーマ
この数日間、Rust の観点から WebAssembly について見てきています。
この WebAssembly ですが、WASI の仕様ではブラウザ以外でも動くことを目的としていますが、もちろん WebAssembly 自体はブラウザ上でポータブルかつ安全に動作することを目的として誕生してきています。ブラウザ上でアプリケーションを動かすというと、JavaScript を思い浮かべると思います。では、WebAssembly が目指しているのは JavaScript の置き換えなのでしょうか?
次の記事に興味深い記述がありました。
WebAssembly は JavaScript に取って代わるものではなく、JavaScriptと一緒に使う素晴らしいツールになることを目指しています。
WebAssembly を介して、Rust と JavaScript の間で次のようなことが実現できるようになることが望まれているということなのです。
- Rust 開発者は、Node.js 開発環境を必要とせずに JavaScript で使用する WebAssembly パッケージを作成できる
- JavaScript 開発者は、Rust 開発環境を必要とせずに WebAssembly を使用できる
wasm-pack
wasm-pack は WebAssembly をターゲットとする Rust クレートを組み立て、パッケージ化するためのツールです。これらのパッケージはnpmレジストリに公開され、他のパッケージと一緒に使用することができます。つまり、JSや他のパッケージと並べて使うことができ、様々な種類のアプリケーションで使うことができます。
wasm-pack インストール
次のシェルでインストールを行います。
curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
wasm-pack -h
wasm-pack 0.10.3
The various kinds of commands that `wasm-pack` can execute
USAGE:
wasm-pack [FLAGS] [OPTIONS] <SUBCOMMAND>
FLAGS:
-h, --help Prints help information
-q, --quiet No output printed to stdout
-V, --version Prints version information
-v, --verbose Log verbosity is based off the number of v used
OPTIONS:
--log-level <log-level> The maximum level of messages that should be logged by wasm-pack. [possible values:
info, warn, error] [default: info]
SUBCOMMANDS:
build 🏗️ build your npm package!
help Prints this message or the help of the given subcommand(s)
login 👤 Add an npm registry user account! (aliases: adduser, add-user)
new 🐑 create a new project with a template
pack 🍱 create a tar of your npm package but don't publish!
publish 🎆 pack up your npm package and publish!
test 👩🔬 test your wasm!
サブコマンド | 説明 |
---|---|
build | NPM パッケージのビルド |
help | ヘルプメッセージの表示 |
login | NPM レジストリにユーザーアカウントを追加 |
new | プロジェクトテンプレートの新規作成 |
pack | NPM パッケージの TAR を作成 (公開はしない) |
publish | NPM パッケージの公開 |
test | WASM のテスト |
wasm-pack のクイックスタート
まずは wasm-pack
の動きを確認してみたいと思います。
プロジェクトテンプレートの作成
hello-wasm
という名前のプロジェクトを作成します。
wasm-pack new hello-wasm
実行結果
[INFO]: ⬇️ Installing cargo-generate...
🐑 Generating a new rustwasm project with name 'hello-wasm'...
🔧 Creating project called `hello-wasm`...
✨ Done! New project created /Users/yanagiharas/Works/hello-wasm
[INFO]: 🐑 Generated new project at /hello-wasm
以下のような構成でプロジェクトテンプレートが生成されます。
hello-wasm
├── Cargo.toml
├── LICENSE_APACHE
├── LICENSE_MIT
├── README.md
├── src
│ ├── lib.rs
│ └── utils.rs
└── tests
└── web.rs
自動生成されたソースコードは後ほどみてみることにして、とりあえずビルドしてみます。
wasm-pack のビルド
プロジェクトテンプレートのルートディレクトリで以下のコマンドを実行します。
wasm-pack build
実行結果
[INFO]: 🎯 Checking for the Wasm target...
info: downloading component 'rust-std' for 'wasm32-unknown-unknown'
info: installing component 'rust-std' for 'wasm32-unknown-unknown'
16.4 MiB / 16.4 MiB (100 %) 15.2 MiB/s in 1s ETA: 0s
[INFO]: 🌀 Compiling to Wasm...
Compiling proc-macro2 v1.0.43
Compiling unicode-ident v1.0.4
Compiling quote v1.0.21
Compiling wasm-bindgen-shared v0.2.83
Compiling log v0.4.17
Compiling syn v1.0.99
Compiling cfg-if v1.0.0
Compiling once_cell v1.14.0
Compiling bumpalo v3.11.0
Compiling wasm-bindgen v0.2.83
Compiling wasm-bindgen-backend v0.2.83
Compiling wasm-bindgen-macro-support v0.2.83
Compiling wasm-bindgen-macro v0.2.83
Compiling console_error_panic_hook v0.1.7
Compiling hello-wasm v0.1.0 (/Users/yanagiharas/Works/hello-wasm)
warning: function `set_panic_hook` is never used
--> src/utils.rs:1:8
|
1 | pub fn set_panic_hook() {
| ^^^^^^^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
warning: `hello-wasm` (lib) generated 1 warning
Finished release [optimized] target(s) in 12.02s
[INFO]: ⬇️ Installing wasm-bindgen...
[INFO]: Optimizing wasm binaries with `wasm-opt`...
[INFO]: Optional fields missing from Cargo.toml: 'description', 'repository', and 'license'. These are not necessary, but recommended
[INFO]: ✨ Done in 0.34s
[INFO]: 📦 Your wasm pkg is ready to publish at /Users/yanagiharas/Works/hello-wasm/pkg.
実行結果の以下の箇所を見てもらえると分かるように、wasm32-unknown-unknown ターゲットを使用してコンパイルを行っていますね。
info: installing component 'rust-std' for 'wasm32-unknown-unknown'
rustup
コマンドでも確認してみましたが、自動でwasm32-unknown-unknownダウンロードされていますね。
rustup show
:
installed targets for active toolchain
--------------------------------------
wasm32-unknown-unknown
:
以下のような構成に成果物が生成されます。
成果物構成
hello-wasm
├── Cargo.lock
├── Cargo.toml
├── LICENSE_APACHE
├── LICENSE_MIT
├── pkg
│ ├── hello_wasm.d.ts
│ ├── hello_wasm.js
│ ├── hello_wasm_bg.js
│ ├── hello_wasm_bg.wasm
│ ├── hello_wasm_bg.wasm.d.ts
│ ├── package.json
│ └── README.md
├── README.md
├── src
│ ├── lib.rs
│ └── utils.rs
├── target
│ ├── CACHEDIR.TAG
│ ├── debug
│ │ ├── build
│ │ │ ├── log-c4086c545319cba9
│ │ │ │ ├── build-script-build
│ │ │ │ ├── build_script_build-c4086c545319cba9
│ │ │ │ ├── build_script_build-c4086c545319cba9.build_script_build.ab37a428-cgu.0.rcgu.o
│ │ │ │ ├── build_script_build-c4086c545319cba9.build_script_build.ab37a428-cgu.1.rcgu.o
│ │ │ │ ├── build_script_build-c4086c545319cba9.build_script_build.ab37a428-cgu.2.rcgu.o
│ │ │ │ ├── build_script_build-c4086c545319cba9.build_script_build.ab37a428-cgu.3.rcgu.o
│ │ │ │ ├── build_script_build-c4086c545319cba9.build_script_build.ab37a428-cgu.4.rcgu.o
│ │ │ │ ├── build_script_build-c4086c545319cba9.build_script_build.ab37a428-cgu.5.rcgu.o
│ │ │ │ ├── build_script_build-c4086c545319cba9.build_script_build.ab37a428-cgu.6.rcgu.o
│ │ │ │ ├── build_script_build-c4086c545319cba9.build_script_build.ab37a428-cgu.7.rcgu.o
│ │ │ │ ├── build_script_build-c4086c545319cba9.build_script_build.ab37a428-cgu.8.rcgu.o
│ │ │ │ ├── build_script_build-c4086c545319cba9.build_script_build.ab37a428-cgu.9.rcgu.o
│ │ │ │ ├── build_script_build-c4086c545319cba9.build_script_build.ab37a428-cgu.10.rcgu.o
│ │ │ │ ├── build_script_build-c4086c545319cba9.build_script_build.ab37a428-cgu.11.rcgu.o
│ │ │ │ ├── build_script_build-c4086c545319cba9.build_script_build.ab37a428-cgu.12.rcgu.o
│ │ │ │ ├── build_script_build-c4086c545319cba9.build_script_build.ab37a428-cgu.13.rcgu.o
│ │ │ │ ├── build_script_build-c4086c545319cba9.build_script_build.ab37a428-cgu.14.rcgu.o
│ │ │ │ ├── build_script_build-c4086c545319cba9.build_script_build.ab37a428-cgu.15.rcgu.o
│ │ │ │ └── build_script_build-c4086c545319cba9.d
│ │ │ ├── log-f76e1d0e5fe37622
│ │ │ │ ├── invoked.timestamp
│ │ │ │ ├── out
│ │ │ │ ├── output
│ │ │ │ ├── root-output
│ │ │ │ └── stderr
│ │ │ ├── proc-macro2-3cbed03846fcf761
│ │ │ │ ├── invoked.timestamp
│ │ │ │ ├── out
│ │ │ │ ├── output
│ │ │ │ ├── root-output
│ │ │ │ └── stderr
│ │ │ ├── proc-macro2-7b299ca0eb78d931
│ │ │ │ ├── build-script-build
│ │ │ │ ├── build_script_build-7b299ca0eb78d931
│ │ │ │ ├── build_script_build-7b299ca0eb78d931.build_script_build.c86a9a86-cgu.0.rcgu.o
│ │ │ │ ├── build_script_build-7b299ca0eb78d931.build_script_build.c86a9a86-cgu.1.rcgu.o
│ │ │ │ ├── build_script_build-7b299ca0eb78d931.build_script_build.c86a9a86-cgu.2.rcgu.o
│ │ │ │ ├── build_script_build-7b299ca0eb78d931.build_script_build.c86a9a86-cgu.3.rcgu.o
│ │ │ │ ├── build_script_build-7b299ca0eb78d931.build_script_build.c86a9a86-cgu.4.rcgu.o
│ │ │ │ ├── build_script_build-7b299ca0eb78d931.build_script_build.c86a9a86-cgu.5.rcgu.o
│ │ │ │ ├── build_script_build-7b299ca0eb78d931.build_script_build.c86a9a86-cgu.6.rcgu.o
│ │ │ │ ├── build_script_build-7b299ca0eb78d931.build_script_build.c86a9a86-cgu.7.rcgu.o
│ │ │ │ ├── build_script_build-7b299ca0eb78d931.build_script_build.c86a9a86-cgu.8.rcgu.o
│ │ │ │ ├── build_script_build-7b299ca0eb78d931.build_script_build.c86a9a86-cgu.9.rcgu.o
│ │ │ │ ├── build_script_build-7b299ca0eb78d931.build_script_build.c86a9a86-cgu.10.rcgu.o
│ │ │ │ ├── build_script_build-7b299ca0eb78d931.build_script_build.c86a9a86-cgu.11.rcgu.o
│ │ │ │ ├── build_script_build-7b299ca0eb78d931.build_script_build.c86a9a86-cgu.12.rcgu.o
│ │ │ │ ├── build_script_build-7b299ca0eb78d931.build_script_build.c86a9a86-cgu.13.rcgu.o
│ │ │ │ ├── build_script_build-7b299ca0eb78d931.build_script_build.c86a9a86-cgu.14.rcgu.o
│ │ │ │ ├── build_script_build-7b299ca0eb78d931.build_script_build.c86a9a86-cgu.15.rcgu.o
│ │ │ │ └── build_script_build-7b299ca0eb78d931.d
│ │ │ ├── quote-129c06d561223642
│ │ │ │ ├── build-script-build
│ │ │ │ ├── build_script_build-129c06d561223642
│ │ │ │ ├── build_script_build-129c06d561223642.build_script_build.b7840aa5-cgu.0.rcgu.o
│ │ │ │ ├── build_script_build-129c06d561223642.build_script_build.b7840aa5-cgu.1.rcgu.o
│ │ │ │ ├── build_script_build-129c06d561223642.build_script_build.b7840aa5-cgu.2.rcgu.o
│ │ │ │ ├── build_script_build-129c06d561223642.build_script_build.b7840aa5-cgu.3.rcgu.o
│ │ │ │ ├── build_script_build-129c06d561223642.build_script_build.b7840aa5-cgu.4.rcgu.o
│ │ │ │ ├── build_script_build-129c06d561223642.build_script_build.b7840aa5-cgu.5.rcgu.o
│ │ │ │ ├── build_script_build-129c06d561223642.build_script_build.b7840aa5-cgu.6.rcgu.o
│ │ │ │ ├── build_script_build-129c06d561223642.build_script_build.b7840aa5-cgu.7.rcgu.o
│ │ │ │ ├── build_script_build-129c06d561223642.build_script_build.b7840aa5-cgu.8.rcgu.o
│ │ │ │ ├── build_script_build-129c06d561223642.build_script_build.b7840aa5-cgu.9.rcgu.o
│ │ │ │ ├── build_script_build-129c06d561223642.build_script_build.b7840aa5-cgu.10.rcgu.o
│ │ │ │ ├── build_script_build-129c06d561223642.build_script_build.b7840aa5-cgu.11.rcgu.o
│ │ │ │ ├── build_script_build-129c06d561223642.build_script_build.b7840aa5-cgu.12.rcgu.o
│ │ │ │ ├── build_script_build-129c06d561223642.build_script_build.b7840aa5-cgu.13.rcgu.o
│ │ │ │ ├── build_script_build-129c06d561223642.build_script_build.b7840aa5-cgu.14.rcgu.o
│ │ │ │ ├── build_script_build-129c06d561223642.build_script_build.b7840aa5-cgu.15.rcgu.o
│ │ │ │ └── build_script_build-129c06d561223642.d
│ │ │ ├── quote-fea490db2b282146
│ │ │ │ ├── invoked.timestamp
│ │ │ │ ├── out
│ │ │ │ ├── output
│ │ │ │ ├── root-output
│ │ │ │ └── stderr
│ │ │ ├── syn-06dea51dce6ae702
│ │ │ │ ├── invoked.timestamp
│ │ │ │ ├── out
│ │ │ │ ├── output
│ │ │ │ ├── root-output
│ │ │ │ └── stderr
│ │ │ ├── syn-218b09b4fcb49b40
│ │ │ │ ├── build-script-build
│ │ │ │ ├── build_script_build-218b09b4fcb49b40
│ │ │ │ ├── build_script_build-218b09b4fcb49b40.build_script_build.c372d88a-cgu.0.rcgu.o
│ │ │ │ ├── build_script_build-218b09b4fcb49b40.build_script_build.c372d88a-cgu.1.rcgu.o
│ │ │ │ ├── build_script_build-218b09b4fcb49b40.build_script_build.c372d88a-cgu.2.rcgu.o
│ │ │ │ ├── build_script_build-218b09b4fcb49b40.build_script_build.c372d88a-cgu.3.rcgu.o
│ │ │ │ ├── build_script_build-218b09b4fcb49b40.build_script_build.c372d88a-cgu.4.rcgu.o
│ │ │ │ ├── build_script_build-218b09b4fcb49b40.build_script_build.c372d88a-cgu.5.rcgu.o
│ │ │ │ ├── build_script_build-218b09b4fcb49b40.build_script_build.c372d88a-cgu.6.rcgu.o
│ │ │ │ ├── build_script_build-218b09b4fcb49b40.build_script_build.c372d88a-cgu.7.rcgu.o
│ │ │ │ ├── build_script_build-218b09b4fcb49b40.build_script_build.c372d88a-cgu.8.rcgu.o
│ │ │ │ ├── build_script_build-218b09b4fcb49b40.build_script_build.c372d88a-cgu.9.rcgu.o
│ │ │ │ ├── build_script_build-218b09b4fcb49b40.build_script_build.c372d88a-cgu.10.rcgu.o
│ │ │ │ ├── build_script_build-218b09b4fcb49b40.build_script_build.c372d88a-cgu.11.rcgu.o
│ │ │ │ ├── build_script_build-218b09b4fcb49b40.build_script_build.c372d88a-cgu.12.rcgu.o
│ │ │ │ ├── build_script_build-218b09b4fcb49b40.build_script_build.c372d88a-cgu.13.rcgu.o
│ │ │ │ ├── build_script_build-218b09b4fcb49b40.build_script_build.c372d88a-cgu.14.rcgu.o
│ │ │ │ ├── build_script_build-218b09b4fcb49b40.build_script_build.c372d88a-cgu.15.rcgu.o
│ │ │ │ └── build_script_build-218b09b4fcb49b40.d
│ │ │ ├── wasm-bindgen-5b3a79ad4436b3f1
│ │ │ │ ├── invoked.timestamp
│ │ │ │ ├── out
│ │ │ │ ├── output
│ │ │ │ ├── root-output
│ │ │ │ └── stderr
│ │ │ ├── wasm-bindgen-33c6ee5785c7cd44
│ │ │ │ ├── build-script-build
│ │ │ │ ├── build_script_build-33c6ee5785c7cd44
│ │ │ │ ├── build_script_build-33c6ee5785c7cd44.build_script_build.b6144499-cgu.0.rcgu.o
│ │ │ │ ├── build_script_build-33c6ee5785c7cd44.build_script_build.b6144499-cgu.1.rcgu.o
│ │ │ │ ├── build_script_build-33c6ee5785c7cd44.build_script_build.b6144499-cgu.2.rcgu.o
│ │ │ │ ├── build_script_build-33c6ee5785c7cd44.build_script_build.b6144499-cgu.3.rcgu.o
│ │ │ │ ├── build_script_build-33c6ee5785c7cd44.build_script_build.b6144499-cgu.4.rcgu.o
│ │ │ │ ├── build_script_build-33c6ee5785c7cd44.build_script_build.b6144499-cgu.5.rcgu.o
│ │ │ │ ├── build_script_build-33c6ee5785c7cd44.build_script_build.b6144499-cgu.6.rcgu.o
│ │ │ │ ├── build_script_build-33c6ee5785c7cd44.build_script_build.b6144499-cgu.7.rcgu.o
│ │ │ │ └── build_script_build-33c6ee5785c7cd44.d
│ │ │ ├── wasm-bindgen-shared-b984bd3bf814ed17
│ │ │ │ ├── invoked.timestamp
│ │ │ │ ├── out
│ │ │ │ ├── output
│ │ │ │ ├── root-output
│ │ │ │ └── stderr
│ │ │ └── wasm-bindgen-shared-f6e8d53f593934cc
│ │ │ ├── build-script-build
│ │ │ ├── build_script_build-f6e8d53f593934cc
│ │ │ ├── build_script_build-f6e8d53f593934cc.build_script_build.01c749de-cgu.0.rcgu.o
│ │ │ ├── build_script_build-f6e8d53f593934cc.build_script_build.01c749de-cgu.1.rcgu.o
│ │ │ ├── build_script_build-f6e8d53f593934cc.build_script_build.01c749de-cgu.2.rcgu.o
│ │ │ ├── build_script_build-f6e8d53f593934cc.build_script_build.01c749de-cgu.3.rcgu.o
│ │ │ ├── build_script_build-f6e8d53f593934cc.build_script_build.01c749de-cgu.4.rcgu.o
│ │ │ ├── build_script_build-f6e8d53f593934cc.build_script_build.01c749de-cgu.5.rcgu.o
│ │ │ ├── build_script_build-f6e8d53f593934cc.build_script_build.01c749de-cgu.6.rcgu.o
│ │ │ ├── build_script_build-f6e8d53f593934cc.build_script_build.01c749de-cgu.7.rcgu.o
│ │ │ ├── build_script_build-f6e8d53f593934cc.build_script_build.01c749de-cgu.8.rcgu.o
│ │ │ ├── build_script_build-f6e8d53f593934cc.build_script_build.01c749de-cgu.9.rcgu.o
│ │ │ ├── build_script_build-f6e8d53f593934cc.build_script_build.01c749de-cgu.10.rcgu.o
│ │ │ ├── build_script_build-f6e8d53f593934cc.build_script_build.01c749de-cgu.11.rcgu.o
│ │ │ ├── build_script_build-f6e8d53f593934cc.build_script_build.01c749de-cgu.12.rcgu.o
│ │ │ ├── build_script_build-f6e8d53f593934cc.build_script_build.01c749de-cgu.13.rcgu.o
│ │ │ ├── build_script_build-f6e8d53f593934cc.build_script_build.01c749de-cgu.14.rcgu.o
│ │ │ ├── build_script_build-f6e8d53f593934cc.build_script_build.01c749de-cgu.15.rcgu.o
│ │ │ └── build_script_build-f6e8d53f593934cc.d
│ │ ├── deps
│ │ │ ├── bumpalo-b655b6eae049e475.d
│ │ │ ├── cfg_if-bc9c12dc3576a706.d
│ │ │ ├── libbumpalo-b655b6eae049e475.rlib
│ │ │ ├── libbumpalo-b655b6eae049e475.rmeta
│ │ │ ├── libcfg_if-bc9c12dc3576a706.rlib
│ │ │ ├── libcfg_if-bc9c12dc3576a706.rmeta
│ │ │ ├── liblog-7e5c333038904839.rlib
│ │ │ ├── liblog-7e5c333038904839.rmeta
│ │ │ ├── libonce_cell-a2b9bd79df042177.rlib
│ │ │ ├── libonce_cell-a2b9bd79df042177.rmeta
│ │ │ ├── libproc_macro2-d53d1e09b7eb3f23.rlib
│ │ │ ├── libproc_macro2-d53d1e09b7eb3f23.rmeta
│ │ │ ├── libquote-d5ab5f6d2ab29cd6.rlib
│ │ │ ├── libquote-d5ab5f6d2ab29cd6.rmeta
│ │ │ ├── libsyn-a0a2cf75bac9b939.rlib
│ │ │ ├── libsyn-a0a2cf75bac9b939.rmeta
│ │ │ ├── libunicode_ident-6cccf60ac10d89b4.rlib
│ │ │ ├── libunicode_ident-6cccf60ac10d89b4.rmeta
│ │ │ ├── libwasm_bindgen_backend-040dfde36dd9b275.rlib
│ │ │ ├── libwasm_bindgen_backend-040dfde36dd9b275.rmeta
│ │ │ ├── libwasm_bindgen_macro-e459735820acadc1.dylib
│ │ │ ├── libwasm_bindgen_macro_support-2ec2193d0f5f8db7.rlib
│ │ │ ├── libwasm_bindgen_macro_support-2ec2193d0f5f8db7.rmeta
│ │ │ ├── libwasm_bindgen_shared-03c3ff7c535952ed.rlib
│ │ │ ├── libwasm_bindgen_shared-03c3ff7c535952ed.rmeta
│ │ │ ├── libwasm_bindgen_test_macro-0fcd318514e57960.dylib
│ │ │ ├── log-7e5c333038904839.d
│ │ │ ├── once_cell-a2b9bd79df042177.d
│ │ │ ├── proc_macro2-d53d1e09b7eb3f23.d
│ │ │ ├── quote-d5ab5f6d2ab29cd6.d
│ │ │ ├── syn-a0a2cf75bac9b939.d
│ │ │ ├── unicode_ident-6cccf60ac10d89b4.d
│ │ │ ├── wasm_bindgen_backend-040dfde36dd9b275.d
│ │ │ ├── wasm_bindgen_macro-e459735820acadc1.d
│ │ │ ├── wasm_bindgen_macro-e459735820acadc1.wasm_bindgen_macro.4afe9ef1-cgu.0.rcgu.o
│ │ │ ├── wasm_bindgen_macro-e459735820acadc1.wasm_bindgen_macro.4afe9ef1-cgu.1.rcgu.o
│ │ │ ├── wasm_bindgen_macro-e459735820acadc1.wasm_bindgen_macro.4afe9ef1-cgu.2.rcgu.o
│ │ │ ├── wasm_bindgen_macro-e459735820acadc1.wasm_bindgen_macro.4afe9ef1-cgu.3.rcgu.o
│ │ │ ├── wasm_bindgen_macro-e459735820acadc1.wasm_bindgen_macro.4afe9ef1-cgu.4.rcgu.o
│ │ │ ├── wasm_bindgen_macro-e459735820acadc1.wasm_bindgen_macro.4afe9ef1-cgu.5.rcgu.o
│ │ │ ├── wasm_bindgen_macro-e459735820acadc1.wasm_bindgen_macro.4afe9ef1-cgu.6.rcgu.o
│ │ │ ├── wasm_bindgen_macro-e459735820acadc1.wasm_bindgen_macro.4afe9ef1-cgu.7.rcgu.o
│ │ │ ├── wasm_bindgen_macro-e459735820acadc1.wasm_bindgen_macro.4afe9ef1-cgu.8.rcgu.o
│ │ │ ├── wasm_bindgen_macro-e459735820acadc1.wasm_bindgen_macro.4afe9ef1-cgu.9.rcgu.o
│ │ │ ├── wasm_bindgen_macro-e459735820acadc1.wasm_bindgen_macro.4afe9ef1-cgu.10.rcgu.o
│ │ │ ├── wasm_bindgen_macro-e459735820acadc1.wasm_bindgen_macro.4afe9ef1-cgu.11.rcgu.o
│ │ │ ├── wasm_bindgen_macro-e459735820acadc1.wasm_bindgen_macro.4afe9ef1-cgu.12.rcgu.o
│ │ │ ├── wasm_bindgen_macro-e459735820acadc1.wasm_bindgen_macro.4afe9ef1-cgu.13.rcgu.o
│ │ │ ├── wasm_bindgen_macro-e459735820acadc1.wasm_bindgen_macro.4afe9ef1-cgu.14.rcgu.o
│ │ │ ├── wasm_bindgen_macro-e459735820acadc1.wasm_bindgen_macro.4afe9ef1-cgu.15.rcgu.o
│ │ │ ├── wasm_bindgen_macro_support-2ec2193d0f5f8db7.d
│ │ │ ├── wasm_bindgen_shared-03c3ff7c535952ed.d
│ │ │ ├── wasm_bindgen_test_macro-0fcd318514e57960.d
│ │ │ ├── wasm_bindgen_test_macro-0fcd318514e57960.wasm_bindgen_test_macro.778e5add-cgu.0.rcgu.o
│ │ │ ├── wasm_bindgen_test_macro-0fcd318514e57960.wasm_bindgen_test_macro.778e5add-cgu.1.rcgu.o
│ │ │ ├── wasm_bindgen_test_macro-0fcd318514e57960.wasm_bindgen_test_macro.778e5add-cgu.2.rcgu.o
│ │ │ ├── wasm_bindgen_test_macro-0fcd318514e57960.wasm_bindgen_test_macro.778e5add-cgu.3.rcgu.o
│ │ │ ├── wasm_bindgen_test_macro-0fcd318514e57960.wasm_bindgen_test_macro.778e5add-cgu.4.rcgu.o
│ │ │ ├── wasm_bindgen_test_macro-0fcd318514e57960.wasm_bindgen_test_macro.778e5add-cgu.5.rcgu.o
│ │ │ ├── wasm_bindgen_test_macro-0fcd318514e57960.wasm_bindgen_test_macro.778e5add-cgu.6.rcgu.o
│ │ │ ├── wasm_bindgen_test_macro-0fcd318514e57960.wasm_bindgen_test_macro.778e5add-cgu.7.rcgu.o
│ │ │ ├── wasm_bindgen_test_macro-0fcd318514e57960.wasm_bindgen_test_macro.778e5add-cgu.8.rcgu.o
│ │ │ ├── wasm_bindgen_test_macro-0fcd318514e57960.wasm_bindgen_test_macro.778e5add-cgu.9.rcgu.o
│ │ │ ├── wasm_bindgen_test_macro-0fcd318514e57960.wasm_bindgen_test_macro.778e5add-cgu.10.rcgu.o
│ │ │ ├── wasm_bindgen_test_macro-0fcd318514e57960.wasm_bindgen_test_macro.778e5add-cgu.11.rcgu.o
│ │ │ ├── wasm_bindgen_test_macro-0fcd318514e57960.wasm_bindgen_test_macro.778e5add-cgu.12.rcgu.o
│ │ │ ├── wasm_bindgen_test_macro-0fcd318514e57960.wasm_bindgen_test_macro.778e5add-cgu.13.rcgu.o
│ │ │ ├── wasm_bindgen_test_macro-0fcd318514e57960.wasm_bindgen_test_macro.778e5add-cgu.14.rcgu.o
│ │ │ └── wasm_bindgen_test_macro-0fcd318514e57960.wasm_bindgen_test_macro.778e5add-cgu.15.rcgu.o
│ │ ├── examples
│ │ └── incremental
│ ├── release
│ │ ├── build
│ │ │ ├── log-8e17bd435e677e14
│ │ │ │ ├── invoked.timestamp
│ │ │ │ ├── out
│ │ │ │ ├── output
│ │ │ │ ├── root-output
│ │ │ │ └── stderr
│ │ │ ├── log-8110063b77aa4aaf
│ │ │ │ ├── build-script-build
│ │ │ │ ├── build_script_build-8110063b77aa4aaf
│ │ │ │ └── build_script_build-8110063b77aa4aaf.d
│ │ │ ├── proc-macro2-0fe559e1762e1ee2
│ │ │ │ ├── invoked.timestamp
│ │ │ │ ├── out
│ │ │ │ ├── output
│ │ │ │ ├── root-output
│ │ │ │ └── stderr
│ │ │ ├── proc-macro2-7f4c886728cc183f
│ │ │ │ ├── build-script-build
│ │ │ │ ├── build_script_build-7f4c886728cc183f
│ │ │ │ └── build_script_build-7f4c886728cc183f.d
│ │ │ ├── quote-261af119deeae240
│ │ │ │ ├── invoked.timestamp
│ │ │ │ ├── out
│ │ │ │ ├── output
│ │ │ │ ├── root-output
│ │ │ │ └── stderr
│ │ │ ├── quote-fcb542550d8e7618
│ │ │ │ ├── build-script-build
│ │ │ │ ├── build_script_build-fcb542550d8e7618
│ │ │ │ └── build_script_build-fcb542550d8e7618.d
│ │ │ ├── syn-0475f13678b293e4
│ │ │ │ ├── invoked.timestamp
│ │ │ │ ├── out
│ │ │ │ ├── output
│ │ │ │ ├── root-output
│ │ │ │ └── stderr
│ │ │ ├── syn-5449a5382e9b53cf
│ │ │ │ ├── build-script-build
│ │ │ │ ├── build_script_build-5449a5382e9b53cf
│ │ │ │ └── build_script_build-5449a5382e9b53cf.d
│ │ │ ├── wasm-bindgen-13c6dee24a302e99
│ │ │ │ ├── build-script-build
│ │ │ │ ├── build_script_build-13c6dee24a302e99
│ │ │ │ └── build_script_build-13c6dee24a302e99.d
│ │ │ ├── wasm-bindgen-shared-a846eb7adf471474
│ │ │ │ ├── invoked.timestamp
│ │ │ │ ├── out
│ │ │ │ ├── output
│ │ │ │ ├── root-output
│ │ │ │ └── stderr
│ │ │ └── wasm-bindgen-shared-af3ee0b2a0b74a26
│ │ │ ├── build-script-build
│ │ │ ├── build_script_build-af3ee0b2a0b74a26
│ │ │ └── build_script_build-af3ee0b2a0b74a26.d
│ │ ├── deps
│ │ │ ├── bumpalo-b465dce7c673ab11.d
│ │ │ ├── cfg_if-69311013c13c8312.d
│ │ │ ├── libbumpalo-b465dce7c673ab11.rlib
│ │ │ ├── libbumpalo-b465dce7c673ab11.rmeta
│ │ │ ├── libcfg_if-69311013c13c8312.rlib
│ │ │ ├── libcfg_if-69311013c13c8312.rmeta
│ │ │ ├── liblog-72a775263f06ca48.rlib
│ │ │ ├── liblog-72a775263f06ca48.rmeta
│ │ │ ├── libonce_cell-7649f78af27836ca.rlib
│ │ │ ├── libonce_cell-7649f78af27836ca.rmeta
│ │ │ ├── libproc_macro2-7edb806784f0b9d5.rlib
│ │ │ ├── libproc_macro2-7edb806784f0b9d5.rmeta
│ │ │ ├── libquote-75b31fea9a41582c.rlib
│ │ │ ├── libquote-75b31fea9a41582c.rmeta
│ │ │ ├── libsyn-9472bbb8d04120df.rlib
│ │ │ ├── libsyn-9472bbb8d04120df.rmeta
│ │ │ ├── libunicode_ident-2b7c8146a2a6d5dd.rlib
│ │ │ ├── libunicode_ident-2b7c8146a2a6d5dd.rmeta
│ │ │ ├── libwasm_bindgen_backend-72413130f80cca07.rlib
│ │ │ ├── libwasm_bindgen_backend-72413130f80cca07.rmeta
│ │ │ ├── libwasm_bindgen_macro-a662b55e8388c081.dylib
│ │ │ ├── libwasm_bindgen_macro_support-d6cf3c77d8a7cec6.rlib
│ │ │ ├── libwasm_bindgen_macro_support-d6cf3c77d8a7cec6.rmeta
│ │ │ ├── libwasm_bindgen_shared-03ea3bb0d4eb97be.rlib
│ │ │ ├── libwasm_bindgen_shared-03ea3bb0d4eb97be.rmeta
│ │ │ ├── log-72a775263f06ca48.d
│ │ │ ├── once_cell-7649f78af27836ca.d
│ │ │ ├── proc_macro2-7edb806784f0b9d5.d
│ │ │ ├── quote-75b31fea9a41582c.d
│ │ │ ├── syn-9472bbb8d04120df.d
│ │ │ ├── unicode_ident-2b7c8146a2a6d5dd.d
│ │ │ ├── wasm_bindgen_backend-72413130f80cca07.d
│ │ │ ├── wasm_bindgen_macro-a662b55e8388c081.d
│ │ │ ├── wasm_bindgen_macro_support-d6cf3c77d8a7cec6.d
│ │ │ └── wasm_bindgen_shared-03ea3bb0d4eb97be.d
│ │ ├── examples
│ │ └── incremental
│ ├── tmp
│ └── wasm32-unknown-unknown
│ ├── CACHEDIR.TAG
│ └── release
│ ├── build
│ │ └── wasm-bindgen-28655a08673543fc
│ │ ├── invoked.timestamp
│ │ ├── out
│ │ ├── output
│ │ ├── root-output
│ │ └── stderr
│ ├── deps
│ │ ├── cfg_if-cd6edacd88c3b663.d
│ │ ├── console_error_panic_hook-47ace22143464b3a.d
│ │ ├── hello_wasm.d
│ │ ├── hello_wasm.wasm
│ │ ├── libcfg_if-cd6edacd88c3b663.rlib
│ │ ├── libcfg_if-cd6edacd88c3b663.rmeta
│ │ ├── libconsole_error_panic_hook-47ace22143464b3a.rlib
│ │ ├── libconsole_error_panic_hook-47ace22143464b3a.rmeta
│ │ ├── libhello_wasm.rlib
│ │ ├── libwasm_bindgen-09ce07d44fa8d9e4.rlib
│ │ ├── libwasm_bindgen-09ce07d44fa8d9e4.rmeta
│ │ └── wasm_bindgen-09ce07d44fa8d9e4.d
│ ├── examples
│ ├── hello_wasm.d
│ ├── hello_wasm.wasm
│ ├── incremental
│ ├── libhello_wasm.d
│ └── libhello_wasm.rlib
└── tests
└── web.rs
package.json
npm パッケージのビルドが正常に行われました。そして、package.json
が生成されています。
その内容を確認してみます。
{
"name": "shinyay-hello-wasm",
"collaborators": [
"NPM_USER_ID <E_MAIL_ADDRESS>"
],
"version": "0.1.0",
"files": [
"hello_wasm_bg.wasm",
"hello_wasm.js",
"hello_wasm_bg.js",
"hello_wasm.d.ts"
],
"module": "hello_wasm.js",
"types": "hello_wasm.d.ts",
"sideEffects": false
}
テスト実行
プロジェクトテンプレートを作ったときにテストコードも自動生成されていました。
(内容はまだ見てません…後でみてみます)
というわけで、テストコードを実行してみようと思います。
--node オプション
--node
オプションは、Node.jsでの実行を想定したテストを全て実行するものです
wasm-pack test --node
実行結果
[INFO]: 🎯 Checking for the Wasm target...
Compiling cfg-if v1.0.0
Compiling scoped-tls v1.0.0
Compiling wasm-bindgen v0.2.83
Compiling console_error_panic_hook v0.1.7
Compiling js-sys v0.3.60
Compiling hello-wasm v0.1.0 (/Users/yanagiharas/Works/hello-wasm)
warning: function `set_panic_hook` is never used
--> src/utils.rs:1:8
|
1 | pub fn set_panic_hook() {
| ^^^^^^^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
warning: `hello-wasm` (lib) generated 1 warning
Compiling wasm-bindgen-futures v0.4.33
Compiling wasm-bindgen-test v0.3.33
warning: `hello-wasm` (lib test) generated 1 warning (1 duplicate)
Finished dev [unoptimized + debuginfo] target(s) in 5.62s
[INFO]: ⬇️ Installing wasm-bindgen...
warning: function `set_panic_hook` is never used
--> src/utils.rs:1:8
|
1 | pub fn set_panic_hook() {
| ^^^^^^^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
warning: `hello-wasm` (lib) generated 1 warning
warning: `hello-wasm` (lib test) generated 1 warning (1 duplicate)
Finished test [unoptimized + debuginfo] target(s) in 0.12s
Running unittests src/lib.rs (target/wasm32-unknown-unknown/debug/deps/hello_wasm-4824064db4dae7b5.wasm)
no tests to run!
Running tests/web.rs (target/wasm32-unknown-unknown/debug/deps/web-726945d3aebc3dc1.wasm)
this test suite is only configured to run in a browser, but we're only testing node.js tests so skipping
--chrome --headless オプション
--chrome --headless
オプションは、ブラウザでの実行を想定したすべてのテストの実行するものです
wasm-pack test --chrome --headless
実行結果
[INFO]: 🎯 Checking for the Wasm target...
warning: function `set_panic_hook` is never used
--> src/utils.rs:1:8
|
1 | pub fn set_panic_hook() {
| ^^^^^^^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
warning: `hello-wasm` (lib) generated 1 warning
warning: `hello-wasm` (lib test) generated 1 warning (1 duplicate)
Finished dev [unoptimized + debuginfo] target(s) in 0.07s
[INFO]: ⬇️ Installing wasm-bindgen...
[INFO]: Getting chromedriver...
warning: function `set_panic_hook` is never used
--> src/utils.rs:1:8
|
1 | pub fn set_panic_hook() {
| ^^^^^^^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
warning: `hello-wasm` (lib) generated 1 warning
warning: `hello-wasm` (lib test) generated 1 warning (1 duplicate)
Finished test [unoptimized + debuginfo] target(s) in 0.10s
Running unittests src/lib.rs (target/wasm32-unknown-unknown/debug/deps/hello_wasm-4824064db4dae7b5.wasm)
no tests to run!
Running tests/web.rs (target/wasm32-unknown-unknown/debug/deps/web-726945d3aebc3dc1.wasm)
Set timeout to 20 seconds...
Running headless tests in Chrome on `http://127.0.0.1:59912/`
Try find `webdriver.json` for configure browser's capabilities:
Not found
running 1 test
test web::pass ... ok
test result: ok. 1 passed; 0 failed; 0 ignored
wasm-pack から npm へのログイン
npm パッケージを公開できるように npm レジストリにログインをします。
wasm-pack login
実行結果
Username: YOUR_USER_ID
Password: YOUR_PASSWORD
Email: (this IS public) YOUR_EMAIL_ADDRESS
Logged in as <username> on registry.npmjs.org.
wasm-pack から npm へパッケージ公開
wasm-pack
コマンドから npm レジストリにパッケージを公開します。
wasm-pack publish
実行結果
npm notice
npm notice 📦 shinyay-hello-wasm@0.1.0
npm notice === Tarball Contents ===
npm notice 2.8kB README.md
npm notice 784B hello_wasm_bg.js
npm notice 270B hello_wasm_bg.wasm
npm notice 80B hello_wasm.d.ts
npm notice 81B hello_wasm.js
npm notice 313B package.json
npm notice === Tarball Details ===
npm notice name: shinyay-hello-wasm
npm notice version: 0.1.0
npm notice filename: shinyay-hello-wasm-0.1.0.tgz
npm notice package size: 2.2 kB
npm notice unpacked size: 4.3 kB
npm notice shasum: f2844678ebe7d3206d[.......]502f28ab708b4
npm notice integrity: sha512-4VP+MvlF+49[.......]99N8DRoNWnw==
npm notice total files: 6
npm notice
npm notice Publishing to https://registry.npmjs.org/
+ shinyay-hello-wasm@0.1.0
[INFO]: 💥 published your package!
特に問題なく公開することができました。
Day 22 のまとめ
今日は wasm-pack
コマンドの導入と、それでできることをいろいろと見てみました。
- wasm-pack インストール
- プロジェクトテンプレートの作成
- プロジェクトビルド
- テスト実行
- npm レジストリへの公開
ただ、自動生成されたコードの内容とか、そもそもテンプレートに手を全く加えていないので、もう少しこのプロジェクトテンプレートについて深堀りしていきたいかなって思いました。
Discussion