Denoばた会議 Monthly 第8回
2022年4月24日開催。
connpassリンク。
今月のアップデートを追う
Denoのアップデートを追っていくLT。
Discord上の会話はザックリと箇条書き。
Deno v1.21
deno check
指定されたモジュールの型チェックを行うコマンドが追加されました。
これにより、deno run
コマンドのデフォルト型チェックは将来的に無効化される予定です。
- deno cacheとの違い
- リモートモジュールをチェックするかどうか
- deno cacheは副作用として型チェックする
新しいサブプロセスAPI
Deno名前空間にspawn
, spawnChild
, 及びspawnSync
の3つのAPIが追加されました。
Deno.run
とは別に追加されたspawnChild
はoutput streamできるDeno.run
は非推奨化する予定- なんで非推奨にするのか、チーム内でも混乱してる
Deno.run
は似てるけどデザインが間違っているせいでエッジケースでコマンドが止まったりデッドロックしたりしてたというのが理由だとか
- 去年くらいからIssueはあった
- 実装というより「我々は何がしたいのか」という議論や名称決定に費やされた
- subprocessとか
- Node.jsによせるならexec
- execというシステムコールを考えると、execではないのでは? ということで否定された
--allow-run
はそのままの名前で残る
deno lsp
の改善
deno.jcon(c)
のTaskに対応し、Task: Run Task
でタスクを実行できるようになりました。
また、ワークスペース内の特定ディレクトリでのみLSPを有効化できるようにenablePaths
オプションが追加され、VS CodeのTesting APIのサポートによりTesting: Focus on Test Explorer View
コマンドを実行すると、テストケースの一覧を表示できるようになりました。
- 昔は
Deno.test()
の上にテスト実行のリンクがあった - 今はそれがなくなり、左のタブに表示する形になった
enablePaths
によってプロジェクトのサブディレクトリのみにLSPを有効化できるようになったので、Node.jsプロジェクトと共存させやすくなった
deno test
の改善
TestContext
オブジェクトにテストケースに関するメタデータ(name
、origin
、及びparent
プロパティ)が追加されました
Deno.test("math", async (t) => {
assert(t.name === "math");
assert(t.origin === Deno.mainModule);
await t.step("sum", (t) => {
assert(t.parent.name === "math");
assert(t.name === "sum");
assert(6 === sum(1, 2, 3));
});
});
- TestContextはSnapshotテストで内部的に使われている
- ユーザーが直接使うことはあまり想定されていない
deno test
でのテストレポートの改善
console.log()
で出力された内容が見やすくなりました。
running 1 test from ./sample_test.js
foo ...
------- output -------
{ message: "foo" }
baz
----- output end -----
deno fmt
とdeno lint
の大幅な高速化
インクリメンタルキャッシュがサポートされ、実行結果がキャッシュされることで大幅な高速化が見込まれます。
deno bench
の改善
n
オプションとwarmup
オプションが削除され、Deno本体が信頼のある結果を得られるまで繰り返しベンチマークを実行するようになりました。
また、ベンチマークのグルーピングもできるようになっています。
Deno.bench({ name: "add", group: "math", baseline: true, fn: () => add(1, 2) });
Deno.bench({ name: "sum", group: "math", fn: () => sum(1, 2, 3, 4, 5) });
benchmark time (avg) (min … max) p75 p99 p995
------------------------------------------------- -----------------------------
add 169.17 ns/iter (157.29 ns … 249 ns) 169.19 ns 221.56 ns 246.76 ns
sum 192.72 ns/iter (187.26 ns … 255.52 ns) 193.52 ns 228.4 ns 230.39 ns
summary
add
1.14x times faster than sum
- 回数指定がなくなった
- グルーピングされた中で比較結果を出してくれる
- Deno内でパフォーマンス改善してる人が2人いて、その人たちの報告方法が反映されている感じ
reportError()
のサポート
Uncaught exceptionを明示的に発生させることができます。
- ブラウザにもあるAPI
- Web標準にもある
- Uncaught exception扱いでエラーが起こせる
addEventListener("error")
も新規追加- DenoはUncaught exceptionを許容しない姿勢だった
- 今回の変更で許容する形になった
- errorイベントやreportErrorもWeb標準なので入れない理由はないよねという感じですんなり通った
- デフォルトではエラーだけど、裏技的にキャンセルできますよって感じ
- Node互換性の観点でいうと、入ってラッキー
deno repl
の改善
--eval-file
オプションが追加され、REPLの起動前に読み込みたいファイルを指定できるようになりました。
また、console.clear()
と同等の挙動を持つclear()
関数がサポートされています。
- PR出した人小話
- 新規社員のColinさんがPR出した
- 元々AWSでAmplifyとか出していたが、最近Denoに
- Node.jsで非常に多くの貢献をされている方
- Node.js本体とlibuvに主たる貢献をされている
- Node.js Technical Steering Committee (TSC)の人
- Node.jsにビルトインされたテストランナーの実装者
Deno.Listener
にref
とunref
メソッドが追加 (unstable)
unref()
が呼ばれたListener
はプロセスの終了をブロックしなくなります(タイマにDeno.unrefTimer
を呼んだときと同様の挙動をします)
deno_std/node/net
でのServer.ref()
やServer.unref()
の実装で利用されています。
- これを使わないと実装できないNode.js互換レイヤーのものがあったので実装された
- get-portというnpmモジュールをDenoで動かしたかった
- RemixをDenoで動かそうとしていて、Remixが内部的にget-portを使っているので実装したかった
DENO_NO_PROMPT
環境変数のサポート
この環境変数を設定すると、Deno v1.19で有効化されたプロンプトの挙動を無効化できるようになりました(--no-prompt
を指定したときと同様の挙動です)
- 環境変数でやることで外部から変更しやすい
deno_std
主にテスト関係の更新です。
外部依存関係をシミュレートできるtesting/mock
、describe
やit
といったBDD(振る舞い駆動開発)ができるtesting/bdd
、日時機能をシミュレートできるtesting/time
、スナップショット検証ができるtesting/snapshot
が追加されました。
- BDDの反響は結構大きかった
- FakeTimeを使うと、引数なしの
new Date()
をFakeTimeで設定した時刻にすることができる - JestのSnapshotテストと同じ挙動になります
Supabase Functions
SupabaseでSupabase FunctionsというFaaSが利用できるようになりました。
Supabase FunctionsはDeno Deployをベースにしており、TypeScriptなどを利用してコードを記述できます。
- Supabaseが内部的にDeno Deployを使って作られている
- ただし、フリープランだと50万リクエスト/月までしか捌けない
- そこに収まらない場合はDeno Deployを使ったほうがいいかも
- 将来的にDeno Deployが有料化されてもSupabase Functionsよりは多いと思う
Netlify Edge Functions (public beta)
NetlifyのEdgeネットワーク上でJavaScriptやTypeScript関数を実行することができます。
現在、RemixやAstro, Nuxt3など様々なフレームワークでNetlify Edge Functionsのサポートが提供されています。
- NetlifyのサービスとしてDeno Deployが使える
- 内部的にDeno Deployが使われている
- 機能差分としては、文法がいじられている
- Deno Deployの従来手法でも動く
- Contextというのが渡っていて、それのnextをやるとなにか起こる
- どの国から返ってくるかというメタ情報も見られる
- Next.jsやNuxt、RemixやSvelteKitのSSRも動く
Aleph.js v1 alpha
Deno Deployがサポートされ、React以外のフレームワーク(Vue.js)もサポートされました。
Remixのようなデータ読み込みAPIが実装され、Tailwind CSSのようなUnoCSSの組み込みサポートも行われています。
また、ts/jsx/tsxのオンデマンドでの変換ができます。
- Deno社でも使っている
Ultra v0.8.0
React v18がサポートされ、src/api/**.{ts,js}
というAPIルートのサポートされました。
他に、deno.json(c)
との統合やサードパーティモジュールのベンダリング、Oakとの互換性が挙げられます。
- v1出たので安定したのかなという印象
- Aleph.jsとUltraとFreshがDeno Deploy対応のフレームワークになった
stripe-nodeパッケージでのDenoサポートについて
stripe-nodeパッケージがDenoでも動作するようになったようです。
質問・今〇〇やってるよコーナー
- pazzaというサードパーティモジュールの紹介
- Denoで動作するパーサコンビネータ
- ドキュメント上にインポート方法しか書かれていないので、手放しにオススメしづらい
- examplesを見ながら実装する形になる
- doc.deno.landのFunctionsを覗くと多少参考になるかも
- Deno Deployでサーバーを立ち上げたポートってどうやって検知しているのか
- ポートはDeno Deployの中では使われていない
- exampleで指定されているのはローカル開発のときに参照するポート
- Socketを立ち上げるので、2つサーバー立てると競合してしまう
- Deno Deploy(や、それを利用したNetlify Edge Functions)ではサーバー2つ立てるのはやめましょう
deno compile
やdeno bundle
をAPIで提供しているのか?deno bundle
相当のことはDeno.emit
でできるdeno compile
のAPIは存在しない- こういったユースケースで必要というのがあれば、Issueを出していただければ