Denoばた会議 Monthly 第11回
2022年7月24日開催。
connpassリンク。
今月のアップデートを追う
Denoのアップデートを追っていくLT。
そのあとの雑談込みでザックリと箇条書き。
Deno v1.24
--check
オプション指定時のトランスパイルの挙動の変更
- v1.23まではtscが使われていたが、v1.24でswcに変更された
--no-check
はv1.23でもswcが使われている--check
の型チェックは変わらずtscが行なう- tscの実行結果をSQLiteにキャッシュする仕組みも導入、型チェックが効率化
- 今まではトランスパイル結果が違って気持ち悪いとかあったかもしれないが、今回のでスッキリした
- デコレーターのオプションがDenoでは有効、オプションでON/OFFできる
- デコレータはデフォルトでデコレートOFFという感じ
- tscの時しかデコレーターOFF設定 (
experimentalDecorators: false
) が有効でなかった - swcのときは
experimentalDecorators: false
に設定しても無視されていた - 今回のでズレが解決した
FFI(Deno.dlopen
)の改善
- Bunきっかけで改善に取り組んだ
- V8 Fast API Calls+JITコンパイル(tinycc)による最適化 (最大で200倍の高速化を実現)
Deno.UnsafeCallback
が追加され、関数ポインタを取り扱えるように- 今まで関数ポインタを取り扱えなかったのが取り扱えるようになった
- JavaScriptで書いた関数をネイティブ拡張側の関数ポインタとして渡せる
- deno-pythonのようなネイティブ拡張として出ているモジュールで活用できそう
Deno.UnsafePointer
が削除され、ポインタはbigint
で取り扱われるように変更- bigintでくるようになったのでシンプルになった
Deno.Child.unref
& Deno.Child.ref
- 子プロセスがDenoの停止をブロックしなくなる(
Deno.unrefTimer
と同様の挙動) - 子プロセスや非同期系は、実行されている間はDenoプログラムは終了しない
- unrefは、その挙動をやめさせることができる
- それを元に戻すのがref
- それが子プロセスに対して有効化された
- Node互換レイヤーで実装したいので本体実装したというのがモチベーション
- Node.jsには同じようなref/unrefがある
- Next.jsやNuxt.jsのフレームワークのどこかで子プロセスのref/unrefが使われているため
import.meta.resolve()
のサポート
- スクリプト自身のURLからみた相対パスを渡すと絶対パスにしてくれる
- import mapも解釈してくれる
- Worker作りたいときに少し楽になるかも
- 今までは
new Worker(new URL('./worker.js', import.meta.url))
という書き方で同じようなことはできていた - しかし、import mapへはアクセスできなかった
- 今までは
- HTMLのSpecでこれを入れる議論が進んでいるため、実装しようという話になった
- 実際は入りそうな匂いを嗅ぎつけて実装されたもの
- LucaさんがSpecの人と密にコミュニケーションしてるので、いち早くキャッチアップできる
- Guyさんというimport大好きなモジュールの専門家が仕様策定している
"unhandledrejection"イベントのサポート
- このイベント出るとDenoの動きがキャンセルされるが、
Event.preventDefault()
でキャンセルできる - プロセス終了をデフォルトの動きとして止められる
- Node互換レイヤーがモチベーション
- Nodeで"unhandledrejection"イベントは結構使われている
- Nodeパッケージでは終了監視でよく使われている
"beforeunload"イベントのサポート
Event.preventDefault()
呼ぶとプロセスがとめられる- ブラウザだと、編集中に画面出ようとする人に確認ダイヤログを出すことに使われる
- 確認ダイアログが出た後ってOK選ぶと閉じる
- ユーザーに確認して操作を委ねるので、止めることはできない
- Denoのオリジナル解釈が入った実装がされている
- Node互換レイヤーがモチベーション
- NodeとDenoの違う挙動を実装できるようになる
- 互換レイヤー実装勢からすると便利な機能
- すぐにわかりやすい便利さというのはないかも
deno.json(c)
でdeno test
がカスタマイズできるように
- ファイルの除外などができるように
- includeとexcludeがある
- 賛否両論ありそう
- Deno.jsonの自動探索があるので、testのディレクトリによって変わる
- Denoを昔から見ている人からするとネガティブめかも
- deno.json内のバランスが難しい
deno test
で--parallel
オプションがサポート
- テストケースを並列実行できる
DENO_JOBS
環境変数で並列数を調整可能- 既存の
--jobs
オプションは非推奨化 - 既存のオプションのわかりにくさを解決
- 引数がなければCPU数をもとに自動で設定
--jobs 4
とflagとvalueの間に=
がなかったので、--jobs
の引数なのかというところが曖昧になってた- 標準モジュールのflagsをよくレビューしているが、こんなのもあるのかというのもありオプションで凝るのはやめてほしいなという気持ち
Deno.Child
とDeno.SpawnOutput
の型定義に変更
- 破壊的変更
- Spawn使ってる人に影響あるかも
- Denoは
Deno.run
とDeno.spawn
という2種類の子プロセスAPIがある - 将来的に消えるが
Deno.run
がstable、Deno.spawn
はunstableなので破壊的変更が起きたりする - 標準出力でnullを渡すと以前は型エラーだったが、実行時エラーになった
deno lsp
でimport-map-remap
コードアクションがサポート
- フルパスで書いてあるものをimport mapで書かれているパスに書き換えてくれる
- quick fixで提案してくれる
- リリース記事に載っている動画が理解しやすい
- リリースノートには載っていないが、オートインポートもサポートされたそう
deno_stdのアップデート
semver
モジュールの追加
- SemVerの比較やバリデーションをする標準モジュール
- 『Denoでコマンドラインツールを雑に作ったので感想』の記事がきっかけで入った模様
- Prettierのメンテナーなどをされている方がtc39のアジェンダなどを見るツールを作成したときに使ってくれた
- npmで使われているnode-semverのforkであるdeno-semverの作者が標準モジュールにPRを出してくれた
- Bartekさんが即座にApprove
- 標準はkt3kさんがちゃんと見るという流れになっているそうで、kt3kさんがレビューした
- 後方互換性のAPIやランダム文字列をSemVerにするなど、不要なAPIを外して標準にマージ
- 作者情報
- vscode_denoのオリジナル作者(?)
- StarランキングでDenoの上にくるリポジトリを持ってるインフルエンサー
encoding/json/stream
モジュールの追加
- JSON Linesのようなものを文字列で処理できる
- ayame113さんが実装してくれた
- 実装はすぐだったけど議論が発生してmergeまでに期間が空いた
- 使いどころが多そう
Denoが2100万ドルを調達
- Deno raises $21M
- DenoやDeno Deployがどのような背景・目的で開発されているのかについても記事中で解説あり
- 日本円で30億くらい
- アメリカスタートアップの規模感あんまわかんないけど、多いらしい
- シリーズA,B,CのうちのシリーズA(最初の正式な資金調達)
- Sequoia Capitalが取りまとめてくれた
- 仲のいいNetlifyの他、GitHub前CEOであるNatさんなどが参加した
- 記事のヒーロー画像の真ん中の握手をよく見ると、恐竜と人間が握手している
- 握手のところかなりリテイクあったとか
- 恐竜を外す話もあった
- シンプルめにしたいという内部意思がある
- Denoくん使いすぎ問題
- ファンシーにし過ぎなんじゃないか問題
- 記事が出たタイミングが事故った
- 21日に出たけど、本来は一週間後
- TechCrunchやSequoia Capitalで一緒にリリース出す予定だった
- TechCrunchが事故で先に出してしまった
- なんだこれ、ってなって急遽リリース
Fresh v1.0.0がリリース
- Freshのリポジトリがdenoland organization配下に移動
- 公式でFreshの紹介記事も公開
- ビルドステップがないファイルルーティングのNext.js
- pagesじゃなくてroutesになっている
- Island Architectureというのを採用している
- ページ内ではPropsも使えない
- イベント系や
islands/
配下のものしか書けず、この配下しかハイドレーションされない
- パッと見の使い勝手はNext.jsに似てるが、仕組みとしてはかなり独自
- Hacker Newsでもかなりコメント数があって、注目されているっぽい
- 最初ビルドステップがあったが、最後のあたりにビルドステップをなくしてリリースした
- Webpackなどビルド系を忌避していた人たちに刺さって注目を集めている
Bunのソースコードが公開
- GitHubリポジトリ
- JavaScriptCoreベースのJavaScriptランタイム
- 今までプライベートで開発していて、Discordで閲覧権を請求したら見られる
- 先々週くらいにOSSになった
- NodeとDenoを比較したデータがWebサイト冒頭に載っている
- drop-in replacementを掲げている
- Nodeと完全互換のすごい速いやつという認識が界隈に広がっている
- よく見ていくと、子プロセスなどNode互換性が足りてないところが散見される
- Next.jsもBun用Shimで動かしている
- どこまで本気でNode互換を目指しているのか、ゴールが不透明
- Deno Land社内の認識としては、Ryanは危機感を持っていて、Lucaさんは気にしていないなど割れている
- 素のHTTPのパフォーマンスでBunに2倍以上負けてる
- HTTPのパフォーマンスについて研究がされている
- 何が遅いのか
- DenoのhttpはHyperが動いてTokioが動いていて、といくつか要因はありそうだった
- Hyperだけにして動かしたらBunに負けた
- TokioとTCPでやったらどうなるか試したら負けた
- システムコールを見て研究している
- Tokioはマルチスレッド前提の色んな処理が入っているので遅い
- Tokioを置き換える話も出ている
- 非同期系の処理を全部Tokioに依存しているので可能なのか? という疑念はある
- シングルスレッドのTokioのようなstokioが開発進行している
- Tokioの開発者と連携しながら勧めている模様
質問や共有コーナー
- Deno Land社の人の入れ替わりが気になる
- Deno Land社の社員紹介ページは割と更新が激しい
- Aaronさんが退社された
- プリンシパルエンジニアという立場だった
- 2021年からコントリビュート
- serde_v8を開発し、Denoの全体的なパフォーマンス向上の立役者
- いつの間にか合わなくなっていたらしい
- パフォーマンスにAaronさんが鋭い
- DenoはAPIが果てしなくあって、そのAPIデザインにはAaronさんと関わらなかった
- 『期待値が合わなかったので別れることになった』という退社定型文で退社された
- 2週間前に引き継ぎ作業があるのが日本だが、そういうのは一切ない
- Aaronさんやめる直前まで普通に仕事してた
- Benさんというもうひとりのプリンシパルエンジニアも過去に退社された
- deno.land/xの検索で、デプロイがされてないモジュールを除外する検索オプションが追加される予定はないか
- 最近検索周りをいじっているので伝えておきます
- deno.landのページで有益な情報をもっと出すという方針になっている
- 名前だけモジュールはノイズなので外すというのは通せると思う
- KitsonさんとLeoさんなど3人がめちゃめちゃいじってる
- 標準ライブラリページのデザイン変わりましたけど気づきました?
Hashrockさんのdeno-jaロゴどれがいい?
- SlackとDenoで複数参加してると切り替えアイコンが出てくる
- 本国のほうにも参加していると同じものが並んでしまう
- 日本サーバー独自のアイコンを設定したい
- ぱっと見てわからない
- Deno忍者はDenoには見えなくない? という問題がある
- 4案に絞ってアンケートを取る
- 背景色ありのものは背景色を抜いてdeno-jaのSlackワークスペースにアンケートを投稿する