Denoばた会議 Monthly 第24回
2023年11月17日開催。
connpassリンク。
今月のアップデートを追う
Denoのアップデートを追っていくLT。
そのあとの雑談込みでザックリと箇条書き。
Deno v1.38
BYONM(Bring your own node_modules
)
- npmやpnpmなどで作成された
node_modules
からnpmパッケージを読み込むための機能 deno.json
で{ "unstable": ["byonm"] }
を指定するか--unstable-byonm
により有効化できる- Node.jsと一緒の方式
- Denoが
node_modules
を作らなくなる - 隠しモジュールが存在しているように振る舞うnpmモジュール(Prismaなど)が動くようになる
- postinstallでN-APIなどのバイナリ拡張をインストールするモジュールが動くように
- バイナリ拡張などはディレクトリに入れてrequireで繋ぐ方法があるが、今回の対応で動く
- Prismaは
.prisma
というディレクトリからrequireしている
- CLIフラグでも行けるし
deno.json
でもいける - これが
package.json
がある場合のデフォルトになることが検討されている - 互換性の変遷
- 最初の互換性が、
node_modules
を作らない - 2つ目の互換性が、Denoが
node_modules
を作りながら依存関係を解決 - 3つ目の互換性として、BYONMに対応した
- ついにここに手を出しました
- 最初の互換性が、
deno doc --html
- APIドキュメントを静的なHTMLページとして出力できる
--output
で指定したフォルダ名が出力されるcargo doc
を意識している- 次のレジストリを作っている途中
- 今のレジストリのドキュメントはサーバーサイドで計算して出している
- 次のレジストリではpublish時に
deno doc --html
で静的にホスティングする - 静的出力のため表示が早くなる
- この機能を使って、次のレジストリではパッケージの中を検索する機能を検討している
- フロントエンドで完結する
- レジストリ全体をAlgoliaに全部突っ込んで検索していたら月額2000ドルもかかった
- レジストリ規模が大きくなるごとに増額するので無効化した
- パッケージごとの検索をよくしようというモチベーション
- その布石としての
deno doc --html
deno doc --lint
- 各APIのJSDocドキュメントに対して検査を行うことができる
- 大量にインターフェースを書いてると、依存の中の依存でドキュメントされていない可能性がある
- deno_stdもこれで大量のドキュメント漏れが見つかった
- CIに組み込めばコントリビュート段階でJSDocの確認ができる
- Node.jsだと同じようなものあるかな……?
HMRがサポート (--unstable-hmr
)
- 使い方は基本的に
--watch
と同様 - モジュールの変更時に、可能な際はプロセス全体を再起動せずに対象のモジュールのみを差し替える
- 特定のモジュールが変更されると
hmr
イベントが発火するため、アプリケーションなどで処理することができる --unstable-hmr
を指定しない場合、モジュールグラフに入っているもののみを検知する--unstable-hmr=file1,file2,...
のように指定されたファイルはモジュールグラフに入っていなくても検知する (ただし、それらの変更時はプロセスが再起動される)- Freshで対応が入るかも
- Deno独自の実装
unstable APIの詳細な制御
deno.json
に"unstable"
フィールドが追加された"unstable": ["kv", "cron"]
のように配列で記述する--unstable-*
オプションによる有効化も可能- LSPに当てるにはCLI引数だとうまくできないので、
deno.json
に書いていく形が推奨になっていく感じがする - 今までは全部が有効化されていたので、絞れるようになったのは良かった
compilerOptions.jsx: "precompile"
- 主にSSRでの利用に最適化されたDeno独自のオプション
- Freshでは次のバージョンあたりで対応が入りそう
- 文字列に置き換えている感じ
- おそらく、Freshのための最適化
- Preactの10.19.0で対応が入っている
- Reactでも専用のAPIを実装すれば対応可能
- PreactのメンテナであるMarvinさんがFreshのメンテナをやっているからこそできる
- 無理やり推し進めている感じはある
- PreactがDenoのものになりつつある感じがある
.env
のサポート (--env
オプション)
--allow-read=.env
なしで.env
を読み込めるのが特徴.env.defaults
など.env
以外からも読み込める--env
の場合はカレントディレクトリの.env
を読む- Node.jsがサポートしたため入った形
--env-file
で設定できる- これを実装した人のツイートを見たBartekさんから提案が出た
- Node.jsに触発されるのは珍しい
- deno_stdのdotenvとの棲み分けが難しそう
- すでに議論がされていて、一瞬いらないんじゃないかって出た
- サードパーティのCLIがカレントディレクトリの
.env
は拾えないので、消されると困るから残ってる - stdとは違うものという解釈になりそう
- Bunは自動で拾う
- こういう仕組みはどこにも定義されてない
- Web開発のプラクティスという感じ
- そういったものをランタイムにビルトインしていいのかわからない
- Denoのdotenvは
.env
と.env.example
と.env.defaults
をデフォルトで読む - Bunレベルでビルトインしてしまうと、それに縛られてしまう
- それは本当によいのだろうか
- 標準的なルールがない世界なので、どのくらいビルトインするのかは慎重な議論が必要
- そこを慎重すぎずに入れたほうがランタイムの売りになるから入れよう! という前のめりな世界観になってる
- ずっとこのままの仕様でも幸せなのか? という疑念はある
- WinterCG案件かも……?
Deno.cron()
- cronが定義できる
- 利用するには
deno.json
で"unstable": ["cron"]
または--unstable-cron
の指定が必要 - 出てきちゃいました
- 賛否両論の機能
- 入っているランタイムは初めてかも
- CloudflareはCron Trigersというのがあるけど、これは設定に定義する形
- Deno Deployでの利用が主となる機能
- Deno KVと同じモチベーション
- Deno DeployはCLIのサブセットというのがあるので、Deno CLIに
Deno.cron()
を入れた
- Deno Queuesを背後で使っている
- 特定の時刻でenqueueをし続けるqueueをシンプルに扱えるようにした形
- Deno Queuesを作った段階でcronを作れる状態になってたので、じゃあ作ろうという感じ
Deno.cron()
があって嬉しいのはDeno Deploy上- Deno Deploy上では必要なときに立ち上がるので、メチャクチャ安いコストでcronができる
- 1日数回実行なら無料枠で収まってしまう
- Deno CLI上ではプロセスを立ち上げっぱなしにしないといけないので、全然嬉しくない
- Deployで真価を発揮する機能
その他の話題
denoland/denokv
が公開
- Deno KVのSQLiteバックエンドやKV connectに関する実装が
denoland/denokv
へ分離された - DockerイメージやCLIの実装なども含まれているため、セルフホストすることも可能
- 前回のDenoばた会議で、Deno CLIがKV ConnectプロトコルというものでローカルからリモートのDeno KVと繋ぐことができることは話した
- KV Connectさえ実装していれば、Deno KVのオペレーションが実行できる
- S3への常時データバックアップができる
- GCSやS3互換のオブジェクトストレージ(Cloudflare R2など)へもバックアップ可能
--sync-from-s3
というCLIフラグでS3などにスナップショットをレプリケーションする--s3-bucket
というCLIフラグでバケットが指定でき、ローカルのインスタンスを立てられる- kt3kさんがソシャゲ会社にいたころは、大量にあるDBのレプリケーションの中でデータ調査用にレプリケーションされるスタンバイサーバーがあったが、それと似たようなこともできるかも
- ソシャゲ会社にいたころはDBがいっぱいあってレプリケーションされてて、マスターとスレーブとスタンバイ(レプリケーションのみされるデータ調査のサーバー)があったが、そういうことができるかも
- Deno CLI時代にけっこうできていたからか、23コミットくらいで提供されている
- 主にLucaさんとIgorさんとHeyangさんで実装されている
- DBの理論部分など、Deno社のDB全体はHeyangさんがリードしている
- JohnさんはDenoと契約してdenokv周りに関わっている
- Deno KVはDenoにロックインしないんだよ、というのを言いたい
- Deno Deploy上のKVを使わずに、なんらかのチューニングがされたDeno KVをセルフホスティングして利用できる
- レプリケーションするLiteStreamなどSQLite周りでバズっているが、これを駆使してチューニングしたよりよいものを自分で作ってみても良い
- これより良いものを作ってくれれば、Denoというベンダーに依存したものではなく、よりオープンなものとして打ち出せる
deno_std/wasi
の非推奨化
deno_std/wasi
が非推奨化- 既に削除されている
- 今後はWasmer JSなどへの移行が推奨されている
- こちらのほうが専門家なので、任せる感じ
- 将来的に
node:wasi
がDeno本体に実装される可能性がありそう- そうなれば、どちらにせよ
deno_std/wasi
は不要かも node:wasi
を実装する場合は、opを使って地道に進める感じになりそうdeno_std/wasi
を流用することはなさそう
- そうなれば、どちらにせよ
- 消した要因
- ダウンロード数が少ない
- WASIはWASMに全振りしたい人が使うものなので、WASI使いたい人はDenoが候補に入らないのでは
- 誰かが強くプッシュしない限り復活はない
Deno Subhosting
- Deno Subhostingというサービスが公開された
- Deno公式でも解説記事があがっている
- Netlify Edge Functionsなどの基盤として利用されている
- これはkt3kさんやhashrockさん、magurotunaさんといったDeno社日本メンバーが大きく関わってる
- ダッシュボードは3週間で突貫工事で作った
- Deno DeployのAPIを叩いてデプロイする
- ユーザーからソースコードを受け取って、その会社にとって都合がいいものを埋め込み、配信できる
- SupabaseだとしたらSupabaseに繋ぎやすいものを埋め込むので、ユーザーはよりSupabaseを利用しやすくなる
- Deno Deployを基盤として、独自機能を噛ませて提供したい事業者向け
- Deno Deploy的なものを作るのは大変だけど、その上に乗せるのなら労力が少ない
- 自分なりのEdoge Functionが作れる
- Deno Subhostingの有料プランは組織向けなので200ドルから
- ご検討ください
Deno Advent Calendar 2023
- QiitaでDeno Advent Calendar 2023が公開!
- 今年は参加者少ない?
- どこのカレンダーも例年より少なめなイメージ
- ElixirのAdvent Calendarは毎年異常な数の記事が出る
- とらラボのアドベントカレンダーは夏もある
- とらラボだと5人くらいで企画して1ヶ月で毎日色んな人が書く
- 月曜日金曜日で横の軸を決める(週ごとのテーマ)
- ビジュアルネタとしてJSで花火を上げる記事とかそういう
- ネタを求められています、という状況のほうが書きやすいというのが一定数ある
- PSVGが一時期流行ったので、それを使ってリアルめ花火を飛ばしたこともある
WinterJSの話
- WinterCGの仕様に沿ったJavaScriptランタイム
- 実際のところは仕様には沿っていない
- Fetch APIのService Workerの実装の仕方が違い、文字列を返すとレスポンス相当となる
質問共有コーナー
Deno.cronのDeno Deploy実行上の実行時間って制限がつく見込みはありますか?
- 実際の実行時間
- Deno Deployは1リクエスト何ミリ秒という制限があったはず
- Deno Subhostingの料金表を見る限り、CPU時間で50ミリ秒
- enqueueやcronにはCPU時間50ミリ秒の制限は適用されていないらしい
- 非同期処理を挟まずに、同期的に2秒以上処理し続ける(イベントループを2秒以上止める)とkillされる
- それ以外の制限はかかっていないらしい
- 仕様自体はおそらく暫定
- どういう制限を入れるかは検討中
Deno KVに有効期限がつきましたが、それを明示していないデータの保存は依然として無期限に保存されますか?
- はい
- データベースと同じような認識でいていただければ
参考資料
上記をまとめる際に眺め、かつ箇条書きの中に含められなかった資料です。
名前だけ掠ってて関係ない資料もあるかと思いますが、まとめる作業の可視化として残しています。
読まなくて大丈夫です。
- Announcing WinterJS
- Rustのドキュメンテーションコメントについて学ぶ #Rust - Qiita
- typescript - Hot-reload (HMR) with 'bun dev' - Stack Overflow
- Watch mode – Runtime | Bun Docs
- feat: deno run --unstable-hmr by bartlomieju · Pull Request #20876 · denoland/deno
- Announcing Deno Queues
- cron - Wikipedia
- Linux - cron and crontab | Department of Computational Biology