Denoばた会議 Monthly 第13回
2022年10月2日開催。
connpassリンク。
今月のアップデートを追う
Denoのアップデートを追っていくLT。
そのあとの雑談込みでザックリと箇条書き。
Denoのリリーススケジュール事情
- Manualにリリーススケジュールページがあるが、更新されなくなった
- GitHub Milestonesを見るようになっている
- 次回更新は10月26日
- V8が4週間でリリースなので、Denoも4週間リリースにしている
Deno v1.26
--allow-sys
オプション
- システム情報を取得するAPIを使う際に指定する
- 新しいパーミッションができたのは3年ぶり
- システムメモリなどOS関係の情報を見るときに利用する
- 今までは
--allow-env
を流用して制御していた - OS関係情報を見るときに環境変数も許可しないといけない状態だったが、今回改善された
- OS関連情報を利用するAPIがすべて
--unstable
だったから雑だったのだが、hostname()
をstableにする流れになり、合わせてパーミッションをちゃんとした - kt3kさんが実装された
--allow-sys-info
という名前だったが、Bartekさんが「短くしたい」と言って、現在の名前になった- 今までのパーミッションが一単語だったので、それに合わせた形
Cache API
- Local Storage同様にパーミッションなしで使える
- ブラウザがパーミッション無しで動くから、それに合わせた?
- SQLiteに保存して永続化している
Response
オブジェクトじゃないものを格納しても機能しない- ファイルサーバーの実装とかで使われるかも
- Deno Deployにはこの形で実装されるのか?
- 同じAPIがDeno Deployでももうすぐ出る
- Deno Deployが先に実装してた
- なぜかCLIが先にリリースされた
- モチベーションとしてはDeno Deployで実装したいというのが先行
- Deno Deployの使い勝手がかなり上がるはず
- 今までは自分でキャッシュする泥臭いやり方だったが、そこがスマートになるはず
--node-modules-dir
オプションがサポート
- pnpmライクなレイアウトで
node_modules
が作られる - これによって、
npm install
なしでViteが動かせるようになった - Node互換性周りの機能
- Node互換性は
npm:
という識別子でnpmモジュールがダウンロードして使えるもの - yarn berryみたいな感じでバーチャルなものが作られる
- それだとviteやprismaなど、フロントエンド系のツールのほとんどはnode_modulesを参照しているので動かない
- バンドラなどはローカルのパスを探しに行っているので、ファイル実体がないと動かないという実情
- つけないとフロントエンド系は動かない
- それで今回対応した
- Node互換性は
実装を急いだ切羽詰まった理由
- ViteConfというところでBartekさんが参加するので、それまでに動かせるようにしたかった
- 実装に難航していたので、先々週までViteConfをキャンセルしそうになってた
- 実装できたのでキャンセルはせずに済んだ
- 実装したのはDavidさん
- Bun作者のJarredさんもViteConfにBun+Viteで出る
- BunもVite対応で大変そう
- 10/01時点で「BunのViteサポートには、さらに10日かかる」とツイートしている
- まだ対応できるのがJarredさんくらいしかいないので、しばらく大変そう
- パネリストの配置が隣同士で、LTスケジュールでもBunの直後なので、競争させられている感
Node.js互換モード(--compat
)の削除
- 破壊的変更
--compat
は動かなくなっている- npm互換(
npm:
識別子)が現在のNode互換 - 互換対応としては
--compat
のほうが楽ではあった- エントリーポイントがNode互換になるだけなので
--compat
とnpm:
識別子の両方があると混乱する--compat
のバグが10個以上あって触りたくないという事情もある
FFI(Deno.dlopen
)におけるJITの仕組みが再実装
- JITの基盤がtinyccからdynasm-rsベースへ移行し、様々な改善が行われている
- Windows x64 PCでもv8 Fast APIによる最適化が適用されるように
- tinyccへの依存が削除
- SELinuxが有効化されている環境でもFFIが動作するように
- アセンブリでいちから書き直ししてるっぽい
- かなり中身が複雑
- パフォーマンスが結構上がってたり、色んなプラットフォームでの対応が可能になった
- tinyccはCでのCコンパイラ
- そもそもなぜJITしているのか?
- FFIする上でJavaScriptのデータ型とネイティブのデータ型をブリッジするのが必要
- そのレイヤーをRustからCのコードを動的に生成し、tinyccでコンパイルすることで高速化していた
- DenoレイヤーでのJITはなかったけど、高速化したいから実施している
- 作った人は外部コントリビュータのArnauさん
- コンバセーションが142なので最高記録かも
- これがDenoへの初めてのPRらしい
パフォーマンスチューニング
TextEncoder/TextDecoder
やファイルシステム関連のAPI、URLなどが高速化- Denoの起動を高速化するために、様々な改善が検討・実施されている
- 結構地道そう
- 少しずつ進んでいるよう
- 最近パフォーマンスチームというのが発足した(Divyさんもメンバー)
- フレームグラフというのを出して横に大きいものを探して改善する
- これに見慣れると「このsystem_callいらなくない?」というのが見えるようになって、それを消すことで改善、という流れになるらしい
- 職人芸っぽい
- billywhizzさんもパフォーマンスチームメンバーで、こういうのが大好物らしい
- Divyさんは高校生のはずなんだけど、どこでこれだけの技術を身につけているのか
unstable APIの安定化
Deno.hostname()
/Deno.refTimer()
/Deno.unrefTimer()
の安定化unrefTimer
はタイマーの性質を変える- MongooseというnpmモジュールをDenoで動かすために安定化させた
- MongoDBのドライバももう動く?
- Mongoose側から歩み寄ってくれたそう
- Flash (
Deno.serve()
)はv1.27で安定化予定- 早いと噂のDeno.serve
- honoは
Deno.serve()
で動いているらしい
Deno.setRaw()
がDeno.stdin.setRaw()
へ移動 (v1.27で安定化予定)- 標準入力の性質を変えるマイナーAPI
- ターミナルのrawモードにするもの
<C-w>
などの特殊なシーケンスをそのまま受け取る必要があるTUIなどのツールを作る場合にrawモードにする必要がある
- stdinでしか使わないので、そこに格納しようという話になった
- 標準入力の性質を変えるマイナーAPI
CLIに関するUIの改善
- パーミッションプロンプトの改善
- 階層化され見やすくなった
- パッケージダウンロードに関する進捗の表示
- 一覧でダーッと出る方式から、npmのようにインストールされているものが入れ代わり立ち代わり表示される形式に
deno lint --compact
- 名前の通りコンパクトに
新しいSlackプラットフォームのオープンベータ版がリリース
- Slackの新しい開発プラットフォームのオープンベータ版が公開されている
- Slack社員による次世代プラットフォームの解説記事もある
- SDKやCLIなどがDenoで書かれており、Denoを使って開発ができる
- yusukebeさんの記事がわかりやすい
- Workspaceが有料であればデプロイ可能
- Botの書き方がDenoになっている
- karma-botというサンプルをyusukebeさんが作成している
- 型定義がガチガチに効いてるので快適に開発ができる
Denoのnpmパッケージサポートに関するロードマップが公開 (#15960)
- TypeScriptサポート (
deno lsp
との連携、@types
との自動的な連携など) - Lockfile(
--lock
)やdeno vendor
などの機能との連携 peerDependencies
やoptionalDependencies
のサポート- アーキテクチャ依存のサブパッケージを書いておくと最適なパッケージがインストールされる
optionalDependencies
というものがある(esbuildなど)- 現状は全部落としてきてしまう
deno_stdで頭字語に関する命名形式の変更が実施
- 破壊的変更
- CSVなどすべて大文字だったものがCsvになる
JSONParseStream
のときはJsonParseStream
とどっちがいい? という多数決があり、そこでは前者になった- Denoの中だとこの命名規則は例外的だったということがわかった
- coreチーム内で議論した結果、キャメルケースで統一するのが良いということになった
- Web標準は逆で、GPUはGPU、URLはURLという感じになってる
Fresh v1.1
- プラグインシステム (例: Twindプラグイン)
- UnoCSSはクラスの生成が非同期なので現状入れられないが、Freshが非同期フックに対応したら入れられる段階になってる
- Preact Signalsのサポート
- v1.1がリリースされた
- 24時間以内にFreshがサポートした
- Islands Architectureと相性がいい
- Islands Architectureは同じレンダリングツリーにいないので、Context APIが使えず難儀していた
_middleware.ts
で複数のミドルウェアが指定できるように改善
Ultraのv2 betaバージョンが公開
- 様々なエコシステムとの連携 (react-query, react-routerなど...)
- Island Architecture (examples/with-islands)
- Honoベースのサーバ実装
- ビルドステップがあるので、Remixと似たような使用感
- Freshはビルドステップないので、ビルドステップがないほうがいい場合はFreshを使ってみるといい
Deno社の人事異動の話
- FFIのJIT再実装をしたArnauさんは入社するっぽい
- カレンダーのDate関係のutilを直してくれた
- 明日からカンパニーページに載るかも
- インターンでmagurotunaさんが入社🎉🎉🎉
- ijeさんが退職された
- Kaylaさんという方も同日に退職された
- 求人は出してる
- 求人は外部サービス使いだした
- SREはDeno Deployを見てくれ、緊急対応含めてできる人
- インフラはAWSの構築周りが得意な人
- パフォーマンスはDeno本体のHTTPのパフォーマンスチューニングができる人
- UI/UXデザイナーはijeさんの穴を埋める的な感じだと推察
質問や共有コーナー
- Deno v2の予定はあったりする?
- しばらく出ない
- Node互換性の向上と合わせてリリース予定だった
- Node互換の入れ方を
npm:
を追加する形になって、破壊的変更ではなくなった - v2をどのタイミングで出すかという話がなくなってしまった
- Softwere Designに連載する話
- skanehiraさんにお願いしようと思っている
- 2〜3回で出してほしいと先方から話があった
- kt3kさんはいくつか記事を溜めているのでできそうもなく、募ったところskanehiraさんが手を上げてくださった
- 1回目は来年1月頃の予定
- 向こうから案は出してくれている
- ページ数の指定は6〜8ページ
- 1ページ1200文字くらい
- magurotunaさんも昔WEB+DB PRESSで連載を持っていた
- コードスニペットやキャプチャは文字数食う
- skanehiraさんはVimの記事を同雑誌に載せていたので編集さんは知ってた
- skanehiraさんはWeb上でもVimの連載を持っていたことがある
- 日本のVimコミュニティは活気がすごい
- 複数のアドカレとか
- アドカレ新年突入とか
- Golangコミュニティも活発
- VimコミュニティとGolangコミュニティの重なりはありそう
- RyanさんもVimmer
- 他のDeno社メンバーはVS Codeが多め
- Cache API がファイルベースの保存となっているのが気になっていて、Deno Deployだとop?を差し替えている?って解釈であっているのか
- あっています
- Opレベルで全部差し替えている
- Cache APIにしてもユーザーの使い勝手は同じだけど、中身は全然違う
- Denoで使う場合は内部でネットワークアクセスとか走る感じになっている
- そのサーバーのファイルに保存とかじゃなくて、各リージョンにレスポンスオブジェクトが格納されるような形になる
- 虎の穴開発室ブログでDeno DeployとUpstashとSupabaseを使って掲示板を作る記事を連載し始める話
- 明日公開される(追記:もう公開されています)
- UpstashはRedis感覚で使っている
- UpstashはQStashというのを使っている
- UpstashがDeno Deploy前提のドキュメントをかなり持っていて、親切
ターミナル周りで盛り上がる
- NeovimとVim
if err != nil
を自力で書いたりLuaSnipで書いたりしている- Neovimはモダンな機能を取り入れる思想が強い
- Vimは互換性を大事にしている
- LuaSnipはNeovimのプラグインの一つ
- NeovimはVim scriptを捨ててLuaに切り替える方向性になっている(プラグインはLua製が多い)
- デスクトップ自動化のHammerspoonも設定ファイルがLuaなので、なんとなく流行ってそう
- WeztermというRust製のターミナルエミュレータがある
- WarpというRust製のターミナルアプリもある
- GitHubでのサインイン必須
- コマンド補完という面だとFigもある
参考資料
上記をまとめる際に眺め、かつ箇条書きの中に含められなかった資料です。
名前だけ掠ってて関係ない資料もあるかと思いますが、まとめる作業の可視化として残しています。
読まなくて大丈夫です。