Open7

Denoことはじめ

jlandownerjlandowner

Deno KV self hostedが良さそうなのでやっとDenoを本格的に触ってみる。
DocumentとExampleがいい感じに揃っているので一通り目を通した。

今のところの感想:

  • インストールは楽: curl -fsSL https://deno.land/x/install/install.sh | sh
  • セキュリティシステムの開発体験が良い. サンプルのhttp server(中でhttp requestもしている)を実行したところ、それぞれのネットワークアクセスで許可を求めるフィードバックが来たのは良い.
    https://docs.deno.com/runtime/manual/getting_started/first_steps#putting-it-all-together-in-an-http-server
  • deno compileはベースのオーバーヘッドがそれなりにある(V8エンジン分かな). hello worldで126.36 MB. コードベースが大きくなった時の伸び方が気になる.
  • hashbang良さそう. bashを駆逐したくなる.
    https://docs.deno.com/runtime/tutorials/hashbang
  • Ryanの言うようにGoの影響が大きいのが見て取れる. 標準パッケージが低レイヤやWeb標準含め良い感じに揃っている. そこにnpmのサポートもあるのがいい.
jlandownerjlandowner

VSCode Pluginでインストールした後に"Check here"を押さないといけないのは罠だった. 押さないと普通のTypescriptとして判定されるので、Denoのimport分でURL指定とかが効かずにちょっとハマった.

プラグインは比較的早くていい.

jlandownerjlandowner

この例を実行したところで、serve()がdeprecatedになっており、Deno.serve()を使うようにという警告が出た.

どうも標準ライブラリの0.196からDeno.serve()を使うように案内されている.

該当のPRから経緯を辿ってみたけど、Deno.serve()の改善Issueは多くあったが、一番最初のIssueには少し調べた限りでは辿り着けなかった.

Deno v1.35のリリースブログでもDeno.serve()が推されているのだけはわかった.
今後DenoのAPIについても標準パッケージとの色分けなどをみていきたい.

例のドキュメントについては、このあたりを見てもちゃんとDeno.serve()になっているようでどうもfirst stepだけ修正漏れっぽいので、PRを出しておいた.
https://github.com/denoland/deno-docs/pull/193

jlandownerjlandowner

zodで環境変数のバリデーションを行った際にBooleanのパースにはまった。
https://github.com/colinhacks/zod/issues/1630

現状z.boolean()はJavaScriptのBoolean()を使用していて、"0""false"といった文字列をfalseとしてパースできない。

先ほどのIssueで色々議論されているが、Goのstrconv.ParseBool()の仕様に合わせたz.string().boolean()を提案した。
https://github.com/colinhacks/zod/pull/2989

多くの人が待ち望んでいる機能のようでGoodは沢山もらったが、リポジトリは2023/10ごろから動いておらず、メンテナからの応答はまだない...

jlandownerjlandowner

Denoには標準でparseArgsというコマンドラインパーサーがついている。
https://deno.land/std@0.211.0/cli/mod.ts

ドキュメントにもあるようにこれはminimistをベースとしていて、node:utilparseArgsとは異なることがわかった。

ちなみにdenoではnode:utilも実装されており、どちらを使うか選ぶことができる。
https://github.com/denoland/deno/pull/21342

std/cliパッケージは現状unstableであるのと、おそらくnode:utilの方が新しいと思われるので、現状ではnode:utilの方がいいんじゃないかという気がする(個人的な書き味の好みとしても)

ちなみに元々std/flagsパッケージにparse()として実装されていたが、std/cliパッケージにparseArgs()と名前が変わっている。時期的には2023/11頃でnode:utilparseArgs()がDenoに実装された時とほぼ同じくらい。
https://github.com/denoland/deno_std/issues/3526

経緯の詳細はわかっていないが、恐らくminimistベースの標準パッケージの方はDenoがnpmサポートをする前に実装されていたのではと思う。そのため、Denoがminimistに熱い想いがあるのではなく、その後npmサポートやnode:utilに標準パーサーが実装されたことで、微妙な立ち位置になってしまったのではないかと推測する。
今後はまたstd/cliの方は破壊的変更の可能性がある(例えばminimistを直接使用すればいいよねなど)ので、しばらくはnode:utilの方が良いのではと思われる。

minimistとnode:utilのparseArgsの違いはいくつか記事が見つかる。
https://hail2u.net/blog/2022-06-08.html