Denoばた会議 Monthly 第8回
2022年4月24日開催。
connpassリンク。
今月のアップデートを追う
Denoのアップデートを追っていくLT。
そのあとの雑談込みでザックリと箇条書き。
Deno v1.21
deno check
- 指定されたモジュールの型チェックを行うコマンド
deno run
コマンドのデフォルト型チェックは将来的に無効化される予定- deno cacheとの違い
- リモートモジュールをチェックするかどうか
- deno cacheは副作用として型チェックする
新しいサブプロセスAPI
- Deno名前空間に3つのAPIが追加
spawn
spawnChild
spawnSync
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
- TestContextはSnapshotテストで内部的に使われている
- ユーザーが直接使うことはあまり想定されていない
deno test
でのテストレポートの改善
console.log()
で出力された内容が見やすくなった
deno fmt
とdeno lint
の大幅な高速化
- インクリメンタルキャッシュがサポート
- 実行結果がキャッシュされることで大幅な高速化が見込まれる
deno bench
の改善
n
オプションとwarmup
オプションが削除- Deno本体が信頼のある結果を得られるまで繰り返しベンチマークを実行するように
- ベンチマークのグルーピングもできるようになった
- 回数指定がなくなった
- グルーピングされた中で比較結果を出してくれる
- 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が利用できるように
- 内部的にDeno Deployが使われている
- Deno Deploy同様にTypeScriptなどを利用してコードを記述できる
- ただし、フリープランだと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サポートについて
質問・今〇〇やってるよコーナー
- 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を出していただければ