Denoばた会議 Monthly 第16回
2023年2月3日開催。
connpassリンク。
今月のアップデートを追う
Denoのアップデートを追っていくLT。
そのあとの雑談込みでザックリと箇条書き。
Deno v1.30
node:
URLのサポート
node:events
などNode.jsの組み込みパッケージをimport
できる- 今までの
npm:
では、Node.jsの組み込みパッケージはわざと外されていた - Node.jsにも
node:
URLは実装されている - Node.jsと足並みを揃えた格好
- Deno社内だと最初の発表との相違を指摘する意見もあった
deno.json(c)
でのImport Mapsの定義がサポート
deno.json(c)
の内容を元に、bare specifierを解釈してくれる- 今までは
import_map.json
に詰め込む必要があった - これもNode互換性の関係
package.json
のように定義できたほうがユーザーフレンドリーではという話から出てきた- Node.jsに寄せたいという意図
- そんなにユーザーへの説明がなかったかも
deno fmtでセミコロンの有無を制御できるように
deno.json
のfmt.options.semiColons
オプションでdeno fmt
のセミコロンの有無を変更できる- こだわり強い人がセミコロンなしを使っているイメージ
- Prettierも最初はセミコロンありで押し通そうとして駄目だったので、同じ道を辿っている
- JavaScript界隈でセミコロンの思想を押し付けるのは無理なのかも
Deno.permissionsに同期バージョンのAPIが追加
Deno.permissions
名前空間にquerySync()
/requestSync()
/revokeSync()
が追加された- もともとは非同期のみだった
- Node互換性界隈で必要とされていた
- Node互換性レベルでTop Level Awaitを使えないので、パーミッションクエリが使えなかった
- 便利になりました
- 非同期のみだったのは、Web標準のNavigator.permissionsに従ったから
- 機能としては同期でも問題なかった
- revokeは仕様のほうが非推奨になった
- 互換性を持たせるために
revoke
を入れたのに、ブラウザからは無くなってしまった - Denoからも無くしたほうがいい、という議論が出るかも
- 互換性を持たせるために
Deno v1.29
Deno.spawn
/Deno.spawnSync
/Deno.spawnChild
の削除
- 今後は
Deno.Command
の使用を推奨 - 練りに練ってこれになったので、使いやすいはず
- 3パターンのユースケースをサポートしたいということから3つできた
- 非同期でプロセスの始まりから終わりまでやるのが
Deno.spawn
- その同期バージョンが
Deno.spawnSync
- プロセスの途中で子プロセスに細かいことしたいときに
Deno.spawnChild
- 非同期でプロセスの始まりから終わりまでやるのが
- これでは意味が区別できてないというツッコミが入った
- Leoさんがデザインを練り練りした
deno.json(c)
でのロックファイルの挙動の制御
lock
プロパティが追加false
で無効化- ファイル名のカスタマイズは
lock
プロパティに./lock.json
などを渡すことで動作 - Denoのlockファイルは、バージョンが合わなかったときに無理やり合わせずに終了しちゃう
- npmのlockファイルは再現できることを保証する
- Denoは再現できることは保証できてない
- 駄目だったら落とすよって感じ
- 今のlockファイルは設計が壊れているので、lockファイルは
false
のほうが安全
- esm.shを入れているとビルド結果が合わないので、
false
にしがち - イミュータブルな保証をしていないCDNを使うと壊れる
deno.land/x
やdeno.land/std
はバージョンさえ指定すればイミュータブル
deno check
コマンドで--all
オプションがサポート
deno check --all mod.ts
でリモートモジュールも含む全ファイルの型チェックが有効化されるdeno check --remote
でも同様の振る舞いを実現できるが、今後は上記の--all
を指定した形式が推奨- 2.0で
--remote
が消えるかも
Denoのロードマップ (2023年 Q1)
deno:
URLのサポート
deno:dax@0.24.0
と記載することでhttps://deno.land/x/dax@0.24.0/mod.ts
がimport
されるdeno.land/std
のみに絞るべきでは? という突っ込みもあるdeno.land/std
に限定するとdeno.land/x
はどうするのかという問題が出るesm:
とかdeno.jsonの拡張あると面白そう- サードパーティがそこを拡張できるようにあったら面白いかも
- 短く書きたいという需要
- 以前は逆張りとしてURL書くのが良いって感じだったけど……
- Deno採用の障壁になっているという認識がRyanさんの中である
- 10の後悔から4年やってみて、Node.jsと水をあけられている現状を鑑みての仕様
package.json
のサポート
package.json
のdependencies
を元にbare specifierを解釈してくれるpackage.json
のscripts
をdeno task
で実行できる- 3つ次のバージョンで
package.json
をサポートする- Q1なので3月までにリリース
package.json
サポートあたりで2.0を出したい気持ち- サーベイでもnpm互換性については質問項目にあった
- npm互換性を使い始めたことでDenoを使い始めたか
- 30%はYesだったので、結構な割合で需要がある
package.json
をノード探索で見つけたらnode_modules
を作るのがいいのでは、という意見もある- 現時点でも
--node-modules-dir
で作成される node_modules
が作られてほしくない場合は従来どおりdeno.json(c)
を使えばいい
- 現時点でも
npm i
に相当するコマンドはない- Denoはdeno_task_shellという独自のやつだけど、Nodeと互換は取れるのか?
- 真の互換性はDenoも独自をやめてShellに渡すようにする
- それをやるとWindowsとmacOSやLinuxで全部統一的に動かせなくなる
deno task
と同じ方針でやろうという方向で進んでいる- 厳密に互換する必要はないのかな、という感じ
その他の計画
node:
URLのサポート (v1.30.0でサポート)deno.json(c)
でのImport mapsの定義 (v1.30.0でサポート)deno bundle
コマンドの非推奨化- 2.0で消えるかも
- SWCに依存している
- そこのバグをDenoメンバーでメンテできないのでやめたい
- esbuildをDeno互換にするものをLucaさんが書かれているので、それを使う感じになりそう
- ライブラリとして同じようなものが出るかも
Deno.emit()
のときもdeno_emitに切り離された- deno_emitにbundleがあるので、そちらに移行するのもありかも
Big news in Deno Land
- npmパッケージのサポートを導入した背景や、Denoの将来などに関する話が行われている
- Ryanさんの頭の中にあることで、まだ取り掛かろうとしている人はいない
ShadowRealm
などを活用したパッケージごとのパーミッション管理のサポートについて--allow-write
を指定した際は、ファイルシステム全体ではなく、カレントディレクトリ配下への書き込みのみを許可すべきでは?- Deno Deployにおける状態管理やCockroachDBやSpannerなどについて
質問や共有コーナー
Node CongressでRyanさんがDeno 2.0について話す
- 4月に開催される
- 3月リリースの1.32から2.0リリースは時期が近いので、割と直前アナウンスになる
Freshを大きく書き換えるという話が出ていたが、それは無くなったのか
- Freshは特に書き直す予定がない
- もしかしてFlash?
- Flashは書き直そうとしているが、なかなかできていない
- 今のやつは一回捨てるくらいのつもりでやろうとしている
- Tokioの内部で使っているmioというのを使っている
- Deno社内ではBunの話は出てこなくなってきた
- 大局的な視点でユーザーを取っていきたいという考えになり、Bunへの意識が減った
- DenoにはCLIチームとDeployチームがあり、パフォーマンスチームもあったがCLIチームに統合された
Romeの資金難について
- 1月頭に退職した社員がチャットに久しぶりに現れた
- Romeは今資金が底をつきそうっぽい
- お金がないから退職って感じ
- モチベーションはある
- RomeはSeedラウンドでだけ調達してて、調達額は450万ドル
- アナウンスから1年半で使ったことになるが、6人の社員で使うにしては早いのでは?
- 大きなサーバーを持っているらしい
- サーバールームを作っているらしい
- 配線の工事などかなり本格的
Gatbyの買収
- Netlifyに買収された
- Next.jsに押されているイメージがある
- Astroが人気高いかも
OSS企業各社の調達について
- BunとAstroが700万ドル
- Romeは450万ドル
- シリーズAにいけるかどうかで結構なハードルがある
- VercelはシリーズDで1億5千万ドル調達している
- Denoはマネタイズという面だとDeno Deployがメインになってくる
- 新メンバーも入ってきている
- エンジニアの人はDeployチームに入る感じになっている
- どんどんビジネスを頑張ろうという感じがしている
- Deployの価格表だと個人はFreeとProがあるが、今のところは大口顧客(NetlifyとかSlackとか)そこら辺との提携を伸ばしていきたい
- Deno Deployはユーザーに見える新機能開発をしていない
- 大口顧客からくる大量のトラフィックをどう捌くかという安定性に注力している
- Cache対応などは安定性のために優先度が下がっているだけ
- 先月新しく入社したHeyangさんが待望の新機能実装をゴリゴリやっている
esm.shをDeno内部で作り直してみようか、みたいな話が以前あったと思うのですが、その後話はどうなりましたか?
- 結論から言うとたまに上がる
- たまにesm.shが破壊的変更が入ってぶっ壊れるので、そのときにどうにかしたいよねという話は出てくる
- でも作り直そうというところまでは行っていない
- 急場凌ぎで対応して、そこで話が終わる
- 同じようなものを作るとしても複雑なことしてるからメンテ大変じゃない? というのはチラッと聞いた
- 破壊的変更が入ったときはCIが通らなくなる
- 年末年始のとき含めて今年で2回くらいぶっ壊れてる
- 先週にv105リリースでまた壊れた
- 作者のXiaさんは業務の中で直してとも言えない
- 先週のバグのときは、CTOのBertさんがIssueを立てて普通のOSSみたいにやり取りしている
社内事情
- LinkdinにDenoのページがある
- メンバーが集合したときの写真が上がっている
- クロアチアに1週間一緒に働くoffsiteというイベントがあった
- 定期イベントになるらしい
- 第2回が今月末にある
- カリブ海のセントルシアに行く
- 日本からだと、アメリカで1泊して合計30時間かかる
- 大体の人が乗り継ぎしないと行けない場所
- 会社に2人インドの人がいるけど、インドのパスポートは行ける国が少ない
- 色々検討した結果、ここになった
- 2月25日土曜日に羽田を出る感じになる
- 実際に会うと日常会話が多くなるので、やり取りが大変そう
- offsiteは年3回あるらしい
- リージョナルoffsiteというのもある
- もっと近い範囲の人が集まって親睦を深める
- offsiteの合間合間に行なわれる
- 2ヶ月に1回出張という感じになりそう
toranoana.deno #11開催!
参考資料
上記をまとめる際に眺め、かつ箇条書きの中に含められなかった資料です。
名前だけ掠ってて関係ない資料もあるかと思いますが、まとめる作業の可視化として残しています。
読まなくて大丈夫です。
- jkrems/proposal-pkg-exports: Proposal for Bare Module Specifier Resolution in node.js
- Modules: ECMAScript modules | Node.js v19.5.0 Documentation
- esm resolver spec and implementation refinements by guybedford · Pull Request #12 · nodejs/ecmascript-modules
- Deno.run と Deno.spawn と Deno.Command のどれを使えば良いのか
- Introducing ShadowRealm | Salesforce Developers Blog