Denoばた会議 Monthly 第8回
2022年4月24日開催。
connpassリンク。
今月のアップデートを追う
Denoのアップデートを追っていくLT。
そのあとの雑談込みでザックリと箇条書き。
Deno v1.21
deno check
- 指定されたモジュールの型チェックを行うコマンド
deno runコマンドのデフォルト型チェックは将来的に無効化される予定- deno cacheとの違い
- リモートモジュールをチェックするかどうか
- deno cacheは副作用として型チェックする
新しいサブプロセスAPI
- Deno名前空間に3つのAPIが追加
spawnspawnChildspawnSync
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オブジェクトにテストケースに関するメタデータが追加nameoriginparent
- 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を出していただければ