Denoことはじめ
Deno KV self hostedが良さそうなのでやっとDenoを本格的に触ってみる。
DocumentとExampleがいい感じに揃っているので一通り目を通した。
- https://docs.deno.com/runtime/manual
- https://docs.deno.com/runtime/tutorials
- https://examples.deno.land
今のところの感想:
- インストールは楽:
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のサポートもあるのがいい.
VSCode Pluginでインストールした後に"Check here"を押さないといけないのは罠だった. 押さないと普通のTypescriptとして判定されるので、Denoのimport分でURL指定とかが効かずにちょっとハマった.
プラグインは比較的早くていい.
最初のdenoの設定はこれだけだった.
{
"deno.enable": true,
"deno.lint": true,
"deno.unstable": true
}
以下を参考にdemo fmt
をファイルセーブ時にかけるようにする.
{
"deno.enable": true,
"deno.lint": true,
"deno.unstable": false,
"editor.formatOnSave": true,
"editor.defaultFormatter": "denoland.vscode-deno"
}
この例を実行したところで、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を出しておいた.
Hono + Deno KVでTODOのAPIサーバを作ってみた
zodで環境変数のバリデーションを行った際にBooleanのパースにはまった。
現状z.boolean()はJavaScriptのBoolean()
を使用していて、"0"
や"false"
といった文字列をfalse
としてパースできない。
先ほどのIssueで色々議論されているが、Goのstrconv.ParseBool()
の仕様に合わせたz.string().boolean()
を提案した。
多くの人が待ち望んでいる機能のようでGoodは沢山もらったが、リポジトリは2023/10ごろから動いておらず、メンテナからの応答はまだない...
Denoには標準でparseArgs
というコマンドラインパーサーがついている。
ドキュメントにもあるようにこれはminimistをベースとしていて、node:util
のparseArgs
とは異なることがわかった。
ちなみにdenoではnode:util
も実装されており、どちらを使うか選ぶことができる。
std/cliパッケージは現状unstableであるのと、おそらくnode:util
の方が新しいと思われるので、現状ではnode:util
の方がいいんじゃないかという気がする(個人的な書き味の好みとしても)
ちなみに元々std/flags
パッケージにparse()
として実装されていたが、std/cli
パッケージにparseArgs()
と名前が変わっている。時期的には2023/11頃でnode:util
のparseArgs()
がDenoに実装された時とほぼ同じくらい。
経緯の詳細はわかっていないが、恐らくminimistベースの標準パッケージの方はDenoがnpmサポートをする前に実装されていたのではと思う。そのため、Denoがminimistに熱い想いがあるのではなく、その後npmサポートやnode:utilに標準パーサーが実装されたことで、微妙な立ち位置になってしまったのではないかと推測する。
今後はまたstd/cliの方は破壊的変更の可能性がある(例えばminimistを直接使用すればいいよねなど)ので、しばらくはnode:utilの方が良いのではと思われる。
minimistとnode:utilのparseArgsの違いはいくつか記事が見つかる。