Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2023-11-17 #45

Merged
merged 5 commits into from
Nov 23, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ Denoばた会議の各回で共有された内容について、箇条書きで
- [第21回](/report/21)
- [第22回](/report/22)
- [第23回](/report/23)
- [第24回](/report/24)

## 開催時期

Expand Down
223 changes: 223 additions & 0 deletions docs/report/24.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,223 @@
# Denoばた会議 Monthly 第24回
2023年11月17日開催。
[connpassリンク](https://deno-ja.connpass.com/event/302178/)。

## 今月のアップデートを追う
Denoのアップデートを追っていくLT。
そのあとの雑談込みでザックリと箇条書き。

[@uki00aさんのスライド](https://uki00a.github.io/slides/denobata-2023-11-17)

### [Deno v1.38](https://deno.com/blog/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](https://github.com/prisma/prisma)など)が動くようになる
- postinstallで[N-API](https://nodejs.org/api/n-api.html)などのバイナリ拡張をインストールするモジュールが動くように
- バイナリ拡張などはディレクトリに入れて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`](https://doc.rust-lang.org/cargo/commands/cargo-doc.html)を意識している
- 次のレジストリを作っている途中
- 今のレジストリのドキュメントはサーバーサイドで計算して出している
- 次のレジストリではpublish時に`deno doc --html`で静的にホスティングする
- 静的出力のため表示が早くなる
- この機能を使って、次のレジストリではパッケージの中を検索する機能を検討している
- フロントエンドで完結する
- レジストリ全体を[Algolia](https://www.algolia.com)に全部突っ込んで検索していたら月額2000ドルもかかった
- レジストリ規模が大きくなるごとに増額するので無効化した
- パッケージごとの検索をよくしようというモチベーション
- その布石としての`deno doc --html`

#### `deno doc --lint`
- 各APIのJSDocドキュメントに対して検査を行うことができる
- 大量にインターフェースを書いてると、依存の中の依存でドキュメントされていない可能性がある
- deno_stdもこれで大量のドキュメント漏れが見つかった
- CIに組み込めばコントリビュート段階でJSDocの確認ができる
- Node.jsだと同じようなものあるかな……?

#### [HMRがサポート](https://github.com/denoland/deno/pull/20876) (`--unstable-hmr`)
- 使い方は基本的に`--watch`と同様
- モジュールの変更時に、可能な際はプロセス全体を再起動せずに対象のモジュールのみを差し替える
- 特定のモジュールが変更されると`hmr`イベントが発火するため、アプリケーションなどで処理することができる
- `--unstable-hmr`を指定しない場合、モジュールグラフに入っているもののみを検知する
- `--unstable-hmr=file1,file2,...`のように指定されたファイルはモジュールグラフに入っていなくても検知する (ただし、それらの変更時はプロセスが再起動される)
- [Freshで対応が入るかも](https://github.com/denoland/deno/pull/20876#issuecomment-1764808464)
- Deno独自の実装
- `hmr`イベントはBunも対応してるかも?
- `bun --hot`というものがある模様
- フロントエンドでのHMRには[Vite](https://github.com/vitejs/vite)などを使う必要があるらしい
- モジュールをランタイムで差し替えて使いたい、という[ありすえ](https://github.com/lambdalisue)さんの希望はこれで叶えられるかも
- 動的インポートをなんらかのトリガーとして0から評価したい
- ファイルパスをいじるとできるけど、これだと別モジュールとしてメモリに溜まっていく
- `--unstable-hmr`で回避できるかも

#### unstable APIの詳細な制御
- `deno.json`に`"unstable"`フィールドが追加された
- `"unstable": ["kv", "cron"]`のように配列で記述する
- `--unstable-*`オプションによる有効化も可能
- LSPに当てるにはCLI引数だとうまくできないので、`deno.json`に書いていく形が推奨になっていく感じがする
- 今までは全部が有効化されていたので、絞れるようになったのは良かった

#### `compilerOptions.jsx: "precompile"`
- 主にSSRでの利用に最適化されたDeno独自のオプション
- Freshでは次のバージョンあたりで[対応](https://github.com/denoland/fresh/pull/2035)が入りそう
- 文字列に置き換えている感じ
- おそらく、Freshのための最適化
- [Preactの10.19.0](https://github.com/preactjs/preact/releases/tag/10.19.0)で[対応](https://github.com/preactjs/preact/pull/4177)が入っている
- Reactでも専用のAPIを実装すれば対応可能
- Preactのメンテナである[Marvin](https://github.com/marvinhagemeister)さんがFreshのメンテナをやっているからこそできる
- 無理やり推し進めている感じはある
- PreactがDenoのものになりつつある感じがある

#### `.env`のサポート (`--env`オプション)
- `--allow-read=.env`なしで`.env`を読み込めるのが特徴
- `.env.defaults`など`.env`以外からも読み込める
- `--env`の場合はカレントディレクトリの`.env`を読む
- [Node.jsがサポートした](https://github.com/nodejs/node/releases/tag/v20.6.0)ため入った形
- `--env-file`で設定できる
- これを実装した人のツイートを見た[Bartek](https://github.com/bartlomieju)さんから提案が出た
- Node.jsに触発されるのは珍しい
- [deno_stdのdotenv](https://deno.land/std@0.207.0/dotenv/mod.ts)との棲み分けが難しそう
- すでに議論がされていて、一瞬いらないんじゃないかって出た
- サードパーティのCLIがカレントディレクトリの`.env`は拾えないので、消されると困るから残ってる
- stdとは違うものという解釈になりそう
- [Bunは自動で拾う](https://bun.sh/docs/runtime/env)
- こういう仕組みはどこにも定義されてない
- Web開発のプラクティスという感じ
- そういったものをランタイムにビルトインしていいのかわからない
- Denoのdotenvは`.env`と`.env.example`と`.env.defaults`をデフォルトで読む
- Bunレベルでビルトインしてしまうと、それに縛られてしまう
- それは本当によいのだろうか
- 標準的なルールがない世界なので、どのくらいビルトインするのかは慎重な議論が必要
- そこを慎重すぎずに入れたほうがランタイムの売りになるから入れよう! という前のめりな世界観になってる
- ずっとこのままの仕様でも幸せなのか? という疑念はある
- [WinterCG](https://github.com/wintercg)案件かも……?

#### `Deno.cron()`
- cronが定義できる
- 利用するには`deno.json`で`"unstable": ["cron"]`または`--unstable-cron`の指定が必要
- 出てきちゃいました
- 賛否両論の機能
- 入っているランタイムは初めてかも
- [Cloudflare](https://www.cloudflare.com/ja-jp/)は[Cron Trigers](https://developers.cloudflare.com/workers/configuration/cron-triggers/)というのがあるけど、これは設定に定義する形
- Deno Deployでの利用が主となる機能
- Deno KVと同じモチベーション
- Deno DeployはCLIのサブセットというのがあるので、Deno CLIに`Deno.cron()`を入れた
- [Deno Queues](https://docs.deno.com/kv/manual/queue_overview)を背後で使っている
- 特定の時刻でenqueueをし続けるqueueをシンプルに扱えるようにした形
- Deno Queuesを作った段階でcronを作れる状態になってたので、じゃあ作ろうという感じ
- `Deno.cron()`があって嬉しいのはDeno Deploy上
- Deno Deploy上では必要なときに立ち上がるので、メチャクチャ安いコストでcronができる
- 1日数回実行なら無料枠で収まってしまう
- Deno CLI上ではプロセスを立ち上げっぱなしにしないといけないので、全然嬉しくない
- Deployで真価を発揮する機能

### その他の話題
#### [`denoland/denokv`](https://github.com/denoland/denokv)が公開
- Deno KVのSQLiteバックエンドや[KV connect](https://github.com/denoland/deno/tree/v1.38.0/ext/kv#kv-connect)に関する実装が`denoland/denokv`へ分離された
- DockerイメージやCLIの実装なども含まれているため、[セルフホストする](https://deno.com/blog/kv-is-open-source-with-continuous-backup)ことも可能
- 前回のDenoばた会議で、Deno CLIがKV ConnectプロトコルというものでローカルからリモートのDeno KVと繋ぐことができることは話した
- KV Connectさえ実装していれば、Deno KVのオペレーションが実行できる
- [S3](https://aws.amazon.com/jp/s3/)への[常時データバックアップ](https://github.com/denoland/denokv#running-as-a-replica-of-a-hosted-kv-database)ができる
- [GCS](https://cloud.google.com/storage/?hl=ja)やS3互換のオブジェクトストレージ([Cloudflare R2](https://www.cloudflare.com/ja-jp/developer-platform/r2/)など)へもバックアップ可能
- `--sync-from-s3`というCLIフラグでS3などにスナップショットをレプリケーションする
- `--s3-bucket`というCLIフラグでバケットが指定でき、ローカルのインスタンスを立てられる
- [kt3k](https://github.com/kt3k)さんがソシャゲ会社にいたころは、大量にあるDBのレプリケーションの中でデータ調査用にレプリケーションされるスタンバイサーバーがあったが、それと似たようなこともできるかも
- ソシャゲ会社にいたころはDBがいっぱいあってレプリケーションされてて、マスターとスレーブとスタンバイ(レプリケーションのみされるデータ調査のサーバー)があったが、そういうことができるかも
- Deno CLI時代にけっこうできていたからか、23コミットくらいで提供されている
- 主に[Luca](https://github.com/lucacasonato)さんと[Igor](https://github.com/igorzi)さんと[Heyang](https://github.com/losfair)さんで実装されている
- DBの理論部分など、Deno社のDB全体はHeyangさんがリードしている
- [John](https://github.com/johnspurlock-skymethod)さんはDenoと契約してdenokv周りに関わっている
- [Deno以外に向けたDeno KV connectプロトコルクライアント](https://github.com/skymethod/kv-connect-kit)を作成している
- Deno KVはDenoにロックインしないんだよ、というのを言いたい
- Deno Deploy上のKVを使わずに、なんらかのチューニングがされたDeno KVをセルフホスティングして利用できる
- レプリケーションする[LiteStream](https://github.com/benbjohnson/litestream)などSQLite周りでバズっているが、これを駆使してチューニングしたよりよいものを自分で作ってみても良い
- これより良いものを作ってくれれば、Denoというベンダーに依存したものではなく、よりオープンなものとして打ち出せる

#### [`deno_std/wasi`](https://github.com/denoland/deno_std/tree/0.206.0/wasi)の非推奨化
- `deno_std/wasi`が非推奨化
- 既に削除されている
- 今後は[Wasmer JS](https://github.com/wasmerio/wasmer-js)などへの移行が推奨されている
- こちらのほうが専門家なので、任せる感じ
- 将来的に`node:wasi`がDeno本体に実装される可能性がありそう
- そうなれば、どちらにせよ`deno_std/wasi`は不要かも
- `node:wasi`を実装する場合は、opを使って地道に進める感じになりそう
- `deno_std/wasi`を流用することはなさそう
- 消した要因
- ダウンロード数が少ない
- WASIはWASMに全振りしたい人が使うものなので、WASI使いたい人はDenoが候補に入らないのでは
- 誰かが強くプッシュしない限り復活はない

#### [Deno Subhosting](https://deno.com/subhosting)
- Deno Subhostingというサービスが公開された
- Deno公式でも[解説記事](https://deno.com/blog/subhosting)があがっている
- [Netlify Edge Functions](https://www.netlify.com/blog/announcing-serverless-compute-with-edge-functions/)などの基盤として利用されている
- これはkt3kさんや[hashrock](https://github.com/hashrock)さん、[magurotuna](https://github.com/magurotuna)さんといったDeno社日本メンバーが大きく関わってる
- ダッシュボードは3週間で突貫工事で作った
- Deno DeployのAPIを叩いてデプロイする
- ユーザーからソースコードを受け取って、その会社にとって都合がいいものを埋め込み、配信できる
- [Supabase](https://github.com/supabase/supabase)だとしたらSupabaseに繋ぎやすいものを埋め込むので、ユーザーはよりSupabaseを利用しやすくなる
- Deno Deployを基盤として、独自機能を噛ませて提供したい事業者向け
- Deno Deploy的なものを作るのは大変だけど、その上に乗せるのなら労力が少ない
- 自分なりのEdoge Functionが作れる
- Deno Subhostingの有料プランは組織向けなので200ドルから
- ご検討ください

#### Deno Advent Calendar 2023
- Qiitaで[Deno Advent Calendar 2023](https://qiita.com/advent-calendar/2023/deno)が公開!
- 今年は参加者少ない?
- どこのカレンダーも例年より少なめなイメージ
- [ElixirのAdvent Calendar](https://qiita.com/advent-calendar/2023/elixir)は毎年異常な数の記事が出る
- [とらラボのアドベントカレンダー](https://toranoana-lab.hatenablog.com/entry/2022/11/24/100000)は[夏もある](https://toranoana-lab.hatenablog.com/entry/2022/06/21/100000)
- とらラボだと5人くらいで企画して1ヶ月で毎日色んな人が書く
- 月曜日金曜日で横の軸を決める(週ごとのテーマ)
- ビジュアルネタとして[JSで花火を上げる記事](https://toranoana-lab.hatenablog.com/entry/2023/07/18/101417)とかそういう
- ネタを求められています、という状況のほうが書きやすいというのが一定数ある
- [PSVG](https://toranoana-lab.hatenablog.com/entry/2022/06/21/100000)が一時期流行ったので、それを使って[リアルめ花火を飛ばした](https://toranoana-lab.hatenablog.com/entry/2020/12/22/155231)こともある

#### [WinterJS](https://github.com/wasmerio/winterjs)の話
- WinterCGの仕様に沿ったJavaScriptランタイム
- 実際のところは仕様には沿っていない
- Fetch APIのService Workerの実装の仕方が違い、[文字列を返すとレスポンス相当となる](https://twitter.com/yusukebe/status/1718835883095552308)

## 質問共有コーナー
### Deno.cronのDeno Deploy実行上の実行時間って制限がつく見込みはありますか?
- 実際の実行時間
- Deno Deployは1リクエスト何ミリ秒という制限があったはず
- Deno Subhostingの料金表を見る限り、CPU時間で50ミリ秒
- enqueueやcronにはCPU時間50ミリ秒の制限は適用されていないらしい
- 非同期処理を挟まずに、同期的に2秒以上処理し続ける(イベントループを2秒以上止める)とkillされる
- それ以外の制限はかかっていないらしい
- 仕様自体はおそらく暫定
- どういう制限を入れるかは検討中

### Deno KVに有効期限がつきましたが、それを明示していないデータの保存は依然として無期限に保存されますか?
- はい
- データベースと同じような認識でいていただければ

## 参考資料
上記をまとめる際に眺め、かつ箇条書きの中に含められなかった資料です。
名前だけ掠ってて関係ない資料もあるかと思いますが、まとめる作業の可視化として残しています。
読まなくて大丈夫です。

- [Announcing WinterJS](https://wasmer.io/posts/announcing-winterjs-service-workers)
- [Rustのドキュメンテーションコメントについて学ぶ #Rust - Qiita](https://qiita.com/simonritchie/items/87d3743e138763ff3e85)
- [typescript - Hot-reload (HMR) with 'bun dev' - Stack Overflow](https://stackoverflow.com/questions/73208846/hot-reload-hmr-with-bun-dev)
- [Watch mode – Runtime | Bun Docs](https://bun.sh/docs/runtime/hot)
- [feat: deno run --unstable-hmr by bartlomieju · Pull Request #20876 · denoland/deno](https://github.com/denoland/deno/pull/20876#issuecomment-1764808464)
- [Announcing Deno Queues](https://deno.com/blog/queues)
- [cron - Wikipedia](https://ja.wikipedia.org/wiki/Cron)
- [Linux - cron and crontab | Department of Computational Biology](https://web.archive.org/web/20190604134927/https://compbio.cornell.edu/about/resources/linux-cron-and-crontab/)