daxはいいぞ
Deno Advent Calendar 2022の16日目の記事です!
Denoでこんな感じのコードを書いていました。内容的には大量(2000個以上)のSVGファイルをゴリゴリとTSXファイルに変換していくなんてことをやっています。
変換部分の本体はsvgrというライブラリを使っています。内容的にはよくわかっていませんが、babelでパースしてastでどうのみたいな感じのようです。
SVGファイルをバッチ的にTSXに変換していくんですが、最後に deno fmt
は手作業でかけなければならずそれが微妙でした。ここはDeno.Command
の出番かな〜とも思ったんですが、前から作者に激推しされていたdax
を使うことにしてみました。
利用方法
というわけでdaxをimportしてきます。
import $ from "https://deno.land/x/dax@0.17.0/mod.ts";
deno fmtを実行するコードはこんな感じでした。簡単!
await $`deno fmt`
$
使ってるのがjQueryを一瞬思い出しますが用途が全然違うので幻覚ですね。tagged templateで書くと視覚的に邪魔にならなくていい感じです。この辺りはネタ元になっている google/zx と同じだと思います。
awaitで待つのもおしゃれだな〜と思います。並列処理なんかも何も悩むことなく書けるでしょうね。
調子に乗って、フォルダの削除とか移動をやっているところを書き換えていきます。
フォルダ削除
// await Deno.remove("./tsx", { recursive: true });
await $`rm -r ./tsx`;
フォルダ移動
// await Deno.rename("./tabler-icons/icons", "./icons");
await $`mv ./tabler-icons/icons ./icons`;
なんとなくスッキリしたような気もしますね。よかったよかった。
いや大丈夫か!? って思われる方は鋭いですね。これだけ見ると、下記のようなことが心配になるはずですね。
- 型をかなぐり捨ててるように見える
- クロスプラットフォームでの動作をかなぐり捨ててるように見える
前者はその通りなのでまあユーザの選択という感じです。新規にdaxで書くというよりは、既存のbashスクリプトを移植するのに使う方が便利かも?短く書けて楽なので私は新規でも使いますが…。
では、クロスプラットフォームはどうなんでしょうか。
daxのクロスプラットフォーム対応
実はdaxで書いたスクリプトは わりとクロスプラットフォームで動作します。なぜなら、実はコマンドが渡される先はOSのシェルではなく deno_task_shell
という自前のパーサとなっております。なんだって〜!?大丈夫なの!? …と心配される方も多そうです。エッジケースは分かりませんが私はdeno_task_shell
で困ったことはないです。というかDeno使ってるみなさんはいつの間にか使っているはずです。実はdeno task
がそれだからですね…!
無造作に使っているmv
やrm
もWindowsで動かなさそうですがクロスプラットフォームで動きます。コマンド類はここに全部置いてありますね。
めちゃくちゃ自前実装…! これを枯れてないから不安と見るか、TSでコンパクトに実装されてるんだからバグが少なそうだしいざとなれば読めるじゃん!と思うかは、これまでのプログラマー人生で培った人生観次第ですね。私は枯れているものへの信用が比較的薄めなので後者です。プログラマーになって十数年、いろんなことがありましたね…。
他のヘルパー関数
他には、シェルにない便利なやつもたくさん生えています。
fetchができるやつとか…
const data = await $.request("https://plugins.dprint.dev/info.json").json();
コマンドにタイムアウトを設定できたり…
await $`some_command`.timeout("1s");
他にも色々あるようなので、気になる方はチェックしてみてください。
Denoは使ううちに気に入ってくる機能が多いのですがdaxもそれで、bashやPowerShell等を直接書く時の独特の不安感みたいなものがだいぶ軽減されていると思います。mv, cp, rmみたいな細かいことはいいからとにかく動いてくれみたいな箇所はdaxで短く書いて、残りの条件分岐やループのあるような難しい処理は普通にDenoでテスト込みで書けます。私はEasyなツールが好きなのでdaxはかなり気に入りました。
Discussion