Denoばた会議 Monthly 第6回
2022年2月20日開催。
connpassリンク。
今月のアップデートを追う
Denoのアップデートを追っていくLT。
そのあとの雑談込みでザックリと箇条書き。
Node学園の話
- Node.jsとDenoの討論イベントが告知された
- 企画の1〜2時間後には告知されてる
- Node.js日本ユーザーグループの古川さんから「徹底討論やりませんか?」と提案
- 徹底討論といいつつノープラン
Deno v1.19
--prompt
の挙動がデフォルト化
- 途中でデフォルトではなくなったが、復活した
- ブラウザの権限確認がそうなっているという根拠
- 標準出力のTTYがユーザー回答不能であれば
--no-prompt
かも - これをデフォルトにするのは1年前からしていて、その時期から合意形成されていた
- このダイアログを出す前後に、消したりする制御コードを使って違う文言にすることで、ほしい権限を取得することができてしまう
- この取得についてのIssueを解決するのに時間がかかった
deno vendorコマンド
- サードパーティモジュールや
import_map.json
をvendor
ディレクトリに書き込む - ネットワークがなくても動くことが保証される
- Goが
vendor
コマンドを持っていて、vendor
ディレクトリをリモートリポジトリにコミットする文化があった - Go 1.12まではこれがベストプラクティスだった
- Go 1.13からはGo Modulesがベストプラクティスに
- それをDenoを追うのかどうかは定かではない
- ネットワーク環境が貧弱なところだと重宝しそう
- CIの成功が保証しやすい
Deno.FileがDeno.FsFileにリネーム
- Web APIのFile APIと混同するため
- 2.0で削除予定
- Linterでも警告が追加されたが、動作していなかったので修正するPRが出されていた(マージ済み)
Deno.FsFile(Deno.File)やDeno.ConnなどでWeb Streams APIがサポート
- lucaさんがふと思いついて入れてくれた
- 今まではreader/writer APIが読み書き
- fetchがStream APIになったので、これからはStream APIだという合意があった
- Async iteratorなので、
for await...of
でも回せる - DenoはWeb Streamなので互換性があって記述が簡潔
- NodeもそろそろFetchが入りそう(undiciが中身)
Deno.Conn
でsetNoDelay()
とsetKeepAlive()
がサポート
- setNoDelay:Nagleアルゴリズムを無効化(全部即座に送信することができる)、TCPの中で即時送信したいときに使う
- setKeepAlive:TCP KeepAliveを無効化
deno compile
の安定性の向上
- 内部的に使っているものをSWCからeszipに切り替え
Deno Deployでは昔からeszipを使っている
- そもそもの制作モチベーションがDeno Deployで使うためだった
- eszipの出力はJSONだが、その中に依存ファイルが記述されていてeszipの中を見るようになる
- bundleみたいにまとめるんじゃなくて別ファイルとしてまとめる
- 本来の挙動と変わらない挙動ができるのがeszip
deno bundle
について
deno bundle
をRyanさんが消そうとして内部から反対を食らっていた- deno bundleはDenoにあるべきじゃないという意見
- 消した場合はサードパーティやエコシステムで担保すればいい
- esbuildのDeno版があるから、そういうのを使えばいい
CompressionStream
とDecompressionStream
がサポート
- gzipをfetchして解凍して
file.writable
に流せば解凍済みのデータが渡せる - 標準モジュール(
deno_std
)にzip化がないのはWeb標準でやるから - 最新の圧縮アルゴリズム(Brotli)を標準に入れるようDenoが働きかけている
シグナルリスナAPIが安定化
- 今まで
Deno.signal
というAsync iteratorだった Deno.addSignalListener
で再実装- 反対もなかったので安定化した
入った経緯
- プロセス落としたときにGUI落としたいけど、昔はできなかったのでhashrockさんがリクエストしてkt3kさんがAsync iteratorで実装
その他の変更点
- Deno.serveHttpでUnixドメインソケットがサポート
- ウォッチャ(
--watch
)で--no-clear-screen
がサポート- イベントがくるたびに画面がどんどんクリアされるため、それを防ぐ
- 開発時にログを見たいが消えてしまうため必要だったと思われる
console.log()
などでの循環参照の表示が改善- どことどこが循環参照起きているかとかわかりやすくなった
- crowlKatsさんが実装してくれた
- Nodeでは実装されているのでそれに合わせた
- 循環参照でサーキュラーという表示になるが、どことどこが循環参照になるかを表示するようになった
- Test Sanitizersのエラー表示が改善
- テストコードでリソースリンクを検出する機能がある
- エラー表示がだいぶ見やすくなった
- 差分を言葉で言うようになった
Deno本体でN-APIの実装が開始
- かなり大きいPR
- Node互換モードが入ってもNodeのネイティブコードが動作しないので、動かせるようにしたい
Deno社の話
- ivyさんは最近インターンで入られた方
- リリースをivyさんがやってたりする
- crowlKatsさんもインターン
- メンバー12人ほど
- 最近bnoordhuisさんが家庭の事情で退職された
- Node初期からのコントリビュータ
- System Callなどの低レイヤーに詳しい方
- libuvにコントリビュートしてるなど情熱は消えてなさそう
- 「喧嘩別れじゃないですよ」ってアナウンスはされていて戻ってくるかも
deno_std/dotenv
deno-dotenv
を標準モジュールに入れたいとbartlomiejuさんが言ってた- 作者本人からPRが出された
deployctl v1
- deployctlのリリースと同時に公式Actionsがリリース
- deployctlはDeno Deployに静的ファイルのデプロイができるCLI
- 公式Actionsはそれを内部に持っている
- ルートを特に指定しないとリポジトリ直下すべてがデプロイされる
- 今回の変更でDeno Deployに静的ファイルを置く場所ができた
- 他のよくあるサービスは、Vercelは基本的に静的ファイル提供するので、Functionsの場合は分岐するけど、すべてのリクエストはJavaScriptで受け取って、静的ファイルへのアクセスはユーザー側に委ねられる
- ブログでも説明されている
- 静的ファイルは何をベースにしているかというと、GitHubにリンクしている場合はリポジトリすべて
- Deno社でも宣伝不足が否めない
- entrypointを
https://deno.land/std/http/file_server.ts
とすると、特にこちらで記述することなくNext.jsなどのビルド成果物をDeno Deployにデプロイできる
aleph-canary
- Vueとかもサポートする計画がある
- 独自パースをRustでやってる
- 昔はesbuildとかでGoも使ってたかも
I’m porting tsc to Go
- Rustで仕様だけ見てやっていたが、移植に切り替えた
- 内部実装にやり方だとRustが厳しいので、Goにした
- Zigも検討した
アフタートーク
Deno 2.0 でのnpm URLサポート提案について
- ryanさんが2.0でnpm URLのサポートを入れたいというIssueを立てて物議を醸している
- Node互換モードはデフォルトで入っているようにしたい
- npmスキームを導入して
npm:
と入れたら動作するようにしたい - 2.0でNode互換モードをデフォルトビルドインにするということが固まっているが、コミュニティには伝わっていないのでサムズダウンばっか出たりする
- Denoという世界観が現状で完成しているという観点に経てば、この機能は蛇足
- Denoを使わない人の意見としては膨大なNode資産が使えないという点が大きい
- 資産が使えないのであれば、デザインがよかったとしても使うことはできない
- このIssueが決定というわけではなく、みんなで叩いてもらって考えていければいいという感じ
- 少し前にはnpmスキームなしでNode資産を使えるようにするプロポーザルが出されていた
- Nodeの中身って汚い
- 型がなかったりランタイムにメソッド打ち込んだり
- 会社的に重要だけど誰も触りたくないので、コアチームでkt3kさんしか作業者がいない
kt3kさんのDeno入社インタビュー
- 2月16日にFindy Engineer Labで記事が公開された
- 12月末にはてな編集部(毛利さん)が声をかけてきて
- JS Confで「Denoで働いてますよ」と軽く言って、あんまり深く言及しなかったから取材がきた
- 『わたしの選択』という特集記事コーナーの2月の記事のために受けてくれないか? という話だった
- 執筆かインタビューか選択できた
- 執筆だと推敲しすぎて情報が減り簡素になってしまうので、インタビューにした
- 編集作業を見てみて面白かった
- 会話の順番を入れ替えたりしてる
- 会話の順番が主眼じゃないので
- コメントがないはてブが多かった
- 情報収集としてのはてブ