Denoばた会議 Monthly 第20回
2023年6月2日開催。
connpassリンク。
今月のアップデートを追う
Denoのアップデートを追っていくLT。
そのあとの雑談込みでザックリと箇条書き。
Deno v1.34
Deno.serve()
のシグネチャの変更
Deno.Server
という新しいオブジェクトが返却されるようになった- 今までは
Promise<void>
だった - モチベーションとしては
ref/unref
をサーバーに実装したかった - サーバーの終了を待つか待たないかということを
ref/unref
でできる - 今までのAPIだとそれの受け口がなかった
- 将来的な拡張を考えると、このほうがいいのかも
- 将来的な拡張の話もメンテナ間で話されている
- Graceful shutdownをサーバーに生やしたい
- 今はAbortSignalでシグナルを呼んで落とす
- これだとリクエストが来てるやつは途中で切り落としてしまう
- Graceful shutdownだとより良い落とし方ができる
- ハンドラ関数があるけど、第二引数になってる
- Deno標準ライブラリの
serve
だとハンドラ関数は第一引数になってる - Google Developer Advocateの人が
setTimeout
などを並べ立てて「ハンドラ関数が第一引数になっているのはデザインの失敗である」とツイートしてた - それにインスパイアされて今回の変更に至った
- Deno標準ライブラリの
deno.json(c)
とCLI引数でglobがサポート
cat vendor/**/*.ts
といった記法ができるようになったtasks
のほうが結構大事- これがないと厳しいタスクもある
deno test
はディレクトリ指定できるのでなんとかなる- 細々したタスクを書くときに困ってたので、これで解決するはず
deno.json(c)
でexclude
フィールドがサポート
- 前バージョンではできなかったトップレベルの
exclude
がサポートされた fmt
やlint
などのexclude
が一括指定できるfmt
とlint
のexclude
ってだいたい同じものを書いてる気がするので、重宝しそう.gitignore
に書いてあるものを除外してくれ、という要望があったけど、これもほしいよね- 別の設定を参照して除外するのはあってもいいのでは
- ESLintにも同じようなものがある
deno.json(c)
でnodeModulesDir
が追加
- これを
true
にすることでnode_modules
が作られる - CLIの
--node-modules-dir
と挙動は同じ - 元々
package.json
を入れると自動でtrue
になるので、あまり使う機会はなさそう?- LSPが
node_modules
の中を見てくれないので、これを追加することで見てくれる - これを
true
にすれば、よりVS Codeで使いやすくなるかも
- LSPが
package.json
に関する挙動の変更
- 前バージョンではアプリケーションが実際に依存しているnpmパッケージのみ、必要に応じてインストールされた
- 今バージョンで、Denoの起動時に
package.json
の依存関係があらかじめインストールされるようになった - Node.jsの挙動に近づいた
- Vite経由でアクセスしてたVue Pluginがアプリケーションに直接依存していないから上手く行かない、というユースケースが動くようになった
その他の話題
Deno Deployでnode:URL
がサポート
- これにより、Deno DeployでExpressが動くようになった
- 現状は
https://esm.sh/express@4.18.2?target=denonext
のようにesm.shのtarget
パラメータにdenonext
を指定する必要がある - 需要は高いだろう対応
- CloudflareもWorkersでNode.jsの一部対応をしている
- Bufferなど基礎的な対応
- Deno Deployは一歩先んじた形
Deno Deployでnpm互換対応が進んでいる
- 将来的にはesm.sh抜きで実装できるかも
- eszipリポジトリでnpmスナップショットをそこに含められるようにしようというPRが進んでいる
- 結構早く出てくるかも
- eszipはDenoで使われているコードを固めるツール
- deno lspで
npm:
を使える道が拓ける
- Deno Deployのnpm互換対応はLucaさんがほぼやってる感じ
- Lucaさんが半年前からランタイムとしてのDenoへの活動が少し下がっているのは、この対応のため
- Deno Deployの中で同期的なAPIが呼ばれる必要があり、そこは分業してた
- BartekさんがNode.jsのクレート周りでリファクタリングしてたけど、これ関係
- いちから作っているわけではなく、Deno本体の
ext/node
を引っ張ってきて作っている- Deno Deployのファイルシステムは仮想なので、本当のファイルシステムに行っていない
- ファイルシステムについてはDeno Deploy向けにしている
- Google Cloud StorageへのネットワークアクセスがDeno Deployでのファイルシステム
- Deno Deploy上でできたらダメなchild_processは無効化されている
- V8のIsolateが同じホストに同居しているので、別プロセスが建てられると攻撃に悪用されてしまうため
Deno DeployのChangelog
- Deno Deployの公式サイトでChangelogページが公開された
- ブログだけだと埋もれてしまうけど、ここを見ればわかるようになった
- 直近で公開された新しいプロジェクト制作フローの話も載っている
- Changelogページはkt3kさんが頑張ってくださいました
- デザインはTailwind UIのCommitテンプレートを購入して使っている
- テンプレートはNext.jsとTailwind CSSなので、FreshとTwindに置き換えている
- Tailwind CSSも日々進化していて、Twindと差分が出ているので置き換えが大変
- DOM構造がわけわからんことになってるので、泥臭い作業をした
- 載ってないけど、
deno.json(c)
に埋め込まれたimport mapが今日からDeno Deployでも使えるようになった
Windmill
- 社内ツールやワークフローを提供するAirplaneなどの代替OSS
- TypeScriptでのスクリプト実行にDenoを採用している
- WindmillのCEOによるDenoを採用した理由を解説した記事がDeno公式に上がっている
- バックエンドでDeno Coreを使っていて、CLIでもガッツリとDenoを使っている
- エンタープライズプランもある
- Denoを使った商用を目指したサービスとしては初……?
- ChizelStrikeもある
- 新しいSlackプラットフォームがCLIとかで使っている
- 事前にDeno CLIのインストールが必要
- 管理画面生成ツールという理解
- 周辺で使ったことある人いないな……
- 日本でもCybozuがKintoneというのを出してますね
- Kintoneの人曰く競合ではない
- どちらかというとSalesforceが競合
- Windmillはプログラムを書くので、ノーコードツールとは別物
- Deno社内もこういうツールは使ったことはない
質問共有コーナー
Deno Deployでオブジェクトストレージを実装する予定ってあるんですか?
- オブジェクトストレージはもっと先か、今のところノープラン
- すでにあるGoogleやAWSのクラウドストレージを使ったほうがいいかも
- 質問のモチベーション
- Deno KVでBlobを切り分けて保存するkv-toolboxで画像保存を試したが、大きな画像を保存できなかった
- kv-toolboxを使っても一度に655KB前後が限度
スケジュール実行(cron)ができるようになるのか
- 話としては2年前から出ている
- 実装されないまま時が過ぎている
- 塩漬けかも
- Deno社内でもcronをしている
- cronの中身のロジックをDeno Deployで書いて、それをGitHub Actionで叩くようにしている
- それで満足してしまっているので議題に上がりづらいのかも
- IPアドレス制限はしているのか
- IPは見ていなかった気がする
- ID/PWでやってる
- Deno社はオフィスを持たずにバラバラでやってるので、IP制限は現実的ではないという事情
KVでatomicの中で関数が渡せると自由度が高まると思いますが、APIは拡張される見込みはありますか?
- 現状のAPIはカウントアップするのに都合が悪い
- アクセスが増えると競合してしまって2回が1回になってしまう
- 特定の文字列が入っていたらという関数が渡せたら良い
- 他でできないシナリオがあれば検討されると思う
- カウンターとかだったら専用のAPIが生えているはず
Deno.AtomicOperation.sum
というAPIがある- 数字だったらこれで代用できる
- そうでなければ、APIを新たに生やしたほうがいいかも
- sumしかないので、これだと足りないかもしれません
- キーがなかったら最後の
get
のメソッドを実行、みたいなことがしたい - イメージ的には
Promise
みたいな「この処理だったらあらかじめ書かれている処理を実行」みたいなことをする
- deploy_feedbackというリポジトリがある
- そこにKVのフィードバックテンプレートがある
- サンプルを載せてフィードバックすれば話が進みやすいのでは
- その後、回答はもらっていて、既存のAPIでカウントアップはできるとのこと
以前サードパーティモジュールページに存在した新規登録や更新されたモジュールの表示は復活したりしますか?
- Leoさんが守護神なので聞いてみます
- できるのかできないのか、何故消えたのか
- Kitsonさんがすごく作り込んだけど、やめられたので一気にLeoさんに
- Leoさんしか知らないことがいっぱいあるのでやめられるとヤバい
dotlandについて
- 実はどこからもserveされてない
- deno.comとdeno.landの2つがある
- deno.landも一部あるが、中身はdeno.com
- dotlandにPRを送ってくださっているんだけど、マージされてもどこにも反映されない
- deno.comはプライベートリポジトリ
- 若干残念な状況
dotlandのArtworkページの今後について
- ArtworkページをRyanさんが丸ごと消そうとしていた
- メンテナンスが負担になり、Deno社で管理している意味を見失った
- それはおかしいんじゃないか、とDenoコミュニティへの譲渡を提案中
- 現状はdeno-jaとDenoLibが候補
- 新しいArtworkページを募集中
- 今のArtworkページのように、タイトルがあってパネルのように作品が並んでいるデザインで
- データだけ抜き出して、そんなサイトをFreshで作ってくれる方がいらっしゃればチャレンジしてみてください
参考資料
上記をまとめる際に眺め、かつ箇条書きの中に含められなかった資料です。
名前だけ掠ってて関係ない資料もあるかと思いますが、まとめる作業の可視化として残しています。
読まなくて大丈夫です。
- Graceful degradation (グレースフルデグラデーション) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN
- 【Go】WebサーバをGraceful Shutdownしてみる
- graceful-shutdown (Protocols BGP) | Juniper Networks
- Spring BootのGraceful Shutdownを試す - CLOVER🍀
- refactor(ext/node): add more methods to 'NodeFs' trait by bartlomieju · Pull Request #18604 · denoland/deno · GitHub
- denoland/apiland: The API server for deno.land
- denoland/deno_registry2: The backend for the deno.land/x service
- denoland/deno_kv_oauth: Minimal OAuth client powered by Deno KV.