はじめに
最近は以下の本でRustを勉強しています。
RustのコードをWebAssemblyにコンパイルして、HTMLのCanvas上にゲームを描画するという内容の本です。
読み進めていくうちに「これってTauri上で動かせるのでは?」と思ったので実際にやってみました。
インストール
事前に以下の2つをインストールしておきます。
rust-webpackのテンプレートを追加します。
$ mkdir sample
$ cd sample
$ npm init rust-webpack
必要なパッケージをインストールして動かします。
$ npm install
$ npm run start
動くことを確認したら、次にTauriをインストールします。
package.json
のscripts
にtauriを追加します。
"scripts": {
...
+ "tauri": "tauri"
}
CLIコマンドをインストールしてtauriのテンプレートを追加します。
$ npm install --save-dev @tauri-apps/cli
$ npm run tauri init
この時に色々聞かれるので答えていきます。
アプリ名ですが今回はフォルダ名と同じsample
にします。
? What is your app name? > sample
ウィンドウタイトルも同じくsample
にします。
? What should the window title be? > sample
アセットの場所を指定します。
npm run build
で各種アセットはsample/dist
に保存されます。
ここではsample/src-tauri/tauri.conf.json
から相対パスを聞かれているので../dist
と入力します。
? Where are your web assets (HTML/CSS/JS) located, relative to the "<current dir>/src-tauri/tauri.conf.json" file that will be created? › ../dist
開発時のURLを入力します。
? What is the url of your dev server? › http://localhost:8080
開発時に実行するコマンドを入力します。
? What is your frontend dev command? › npm run start
ビルド時に実行するコマンドを入力します。
? What is your frontend build command? › npm run build
現状のコマンドだとtauri起動時にブラウザも立ち上がるのでscripts
のコマンドを以下の様に修正します。
"scripts": {
- "start": "rimraf dist pkg && webpack-dev-server --open -d",
+ "start": "rimraf dist pkg && webpack-dev-server",
tauriを起動させます。
$ npm run tauri dev
ウィンドウが表示されます。
Node.jsのバージョンによってはError: error:0308010C:digital envelope routines::unsupported
となることがあります。
その場合は以下のコマンドを修正してから起動させます。
"scripts": {
- "start": "rimraf dist pkg && webpack-dev-server",
- "build": "rimraf dist pkg && webpack",
+ "build": "set NODE_OPTIONS=--openssl-legacy-provider && rimraf dist pkg && webpack",
+ "start": "set NODE_OPTIONS=--openssl-legacy-provider && rimraf dist pkg && webpack-dev-server",
描画
ウィンドウ上に図形を描画します。
Cargo.toml
にモジュールを追加します。
[dependencies.web-sys]
version = "0.3.22"
- features = ["console"]
+ features = ["console", "Window", "Document", "HtmlCanvasElement", "CanvasRenderingContext2d"]
Canvasを追加します。
<body>
<script src="index.js"></script>
+ <canvas id="canvas" tabindex="0" width="500" height="500"></canvas>
</body>
三角形を描画するコードを追加します。
// This is like the `main` function, except for JavaScript.
#[wasm_bindgen(start)]
pub fn main_js() -> Result<(), JsValue> {
...
// Your code goes here!
console::log_1(&JsValue::from_str("Hello world!"));
let window = web_sys::window().unwrap();
let document = window.document().unwrap();
let canvas = document
.get_element_by_id("canvas")
.unwrap()
.dyn_into::<web_sys::HtmlCanvasElement>()
.unwrap();
let context = canvas
.get_context("2d")
.unwrap()
.unwrap()
.dyn_into::<web_sys::CanvasRenderingContext2d>()
.unwrap();
context.begin_path();
context.move_to(250.0, 0.0);
context.line_to(0.0, 500.0);
context.line_to(500.0, 500.0);
context.close_path();
context.set_fill_style(&wasm_bindgen::JsValue::from_str("rgb(0,128,255)"));
context.fill();
Ok(())
}
ウィンドウ上に三角形が描画されました。
ビルド
最後にビルドできることを確認します。
sample/src-tauri/tauri.conf.json
のidentifier
を任意の値に変えて以下のコマンドを実行します。
$ npm run tauri build
sample/src-tauri/target/release
に実行ファイルが生成されました。
参考文献