Denoばた会議 Monthly 第21回
2023年7月21日開催。
connpassリンク。
今月のアップデートを追う
Denoのアップデートを追っていくLT。
そのあとの雑談込みでザックリと箇条書き。
Deno v1.35
Astroが動作するように
- Node.jsの互換性が改善され、Astroが動作するようになった
- 『Deno v1.35でAstroが使えるように』でも解説されている
- Deno公式ブログでも解説記事が出ている
- AstroはDenoとの相性が元々良い
- Astro自身がDeno用のアダプタをメンテしてくれている
- AstroのCLIを叩くあたりだと怪しいので、まだ不安定かもしれない
- Tasksへの記載は
astro dev
で良い- Tasks内での
deno run ~~
は特に不要 - v1.31のpackage.jsonサポートでpackage.jsonを探索するようになったため
- Tasks内での
Deno.serve
が安定化
- ハンドラ関数の位置が逆になっている
- 「
Deno.serve
は複数行のハンドラがインラインに書かれる可能性が高いので、オプションを見逃さないよう前に置いた」という旨の回答が安定化のPRに書かれていた
- 「
- deno_stdのserveとserveTlsは非推奨になった
- v0.195.0より後のバージョンでリリースされる予定
- serveLisnerは
Deno.serve
がUNIXドメインソケットに対応していないこともあって非推奨になっていない
Deno KVでキューが実装
kv.enqueue
という形でメッセージを追加kv.listenQueue
でキューを購読kv.close
でresolveされる- キューは継続的に動くものが多いイメージ
- Deno DeployはWorkerがシャットダウンされる
- インスタンスがもう一度立ち上がらないといけないから、どうするんだろう
- 何かしら継続させる方法はなされているはず
- 後々、ちゃんとしたドキュメントが出てくると良い
- 作った人の意図としては、AWSのSQSやRedisのJob機能を目指して作ってる
- キューでディレイできるのか?
- 整合性のあるものが保存されているはず
- いずれブログで説明があるはずなので、みんなで待ちましょう
- Deno社内で各自の専門性があがりすぎて、自分以外の作業だと「なんもわからん」になりがち
ReadableStream.from
が実装
- Web標準API
- deno_stdに
readableStreamFromIterable
という同じようなものがあった- 今回の実装に合わせて非推奨になった
- MDNにまだ載っていない
- WHATWGのWeb Specに載ったらすぐに実装された
- 最近までMDNになかったものとして
getSetCookie
がある- TypeScriptの型定義が追いついていない
- v5.2で追加される予定
- 話は逸れるが、このモジュールのコード内部にも書かれている
// This module is browser compatible.
があるとdom.d.tsを読む仕様がDenoにある
deno lint
にFresh向けのルールが追加
deno.json(c)
で"fresh"
タグを指定することで有効化できる- Freshでやりがちなミスを防ぐルール
- handler関数の誤字指摘
- islandコンポーネント以外でonClickなどサーバーイベントをエラーとする
- デフォルトではOFFになっている
- lint.deno.landでも見られる
- v1.3.0でFreshのプロジェクト作成でデフォルトで追加されるようになった
Fresh v1.2
メインメンテナが変わった
- PreactのメンテナのMarvinさん
- メインメンテナが変わってから速度がすごい上がった
- Issue処理能力がすごい
- Preactを知り尽くしてるというのもある
Islandコンポーネントでprops.children
がサポート
- Islandコンポーネントに子要素を書けるようになった
- いったんChildrenだけ対応した
- まだ使えないpropsがある
Islandコンポーネントでnpmパッケージがサポート
- npmパッケージを使った開発が可能に
npm:
のほうが精密性は高いので良い対応- Freshのpreactも将来的にesm.shから
npm:
にしたほうが安定性が上がりそう
プラグインシステムでrenderAsync
フックがサポート
- SSRの実行前後に非同期処理を仕込めるようになった
- ユーザーとしては非同期系のプラグインが作成できるようになったという理解でOK
- これにより、UnoCSSの公式サポートが入る可能性がある
- 未だにTailwind CSSは新機能を追加してて、それに追従するのが大変
- TwindもTailwind CSSに追従しきれていないところがある
- UnoCSSはVueコミュニティなどがガッツリついている
- UnoCSSの今後に期待したい
Fresh v1.3
非同期のRouteコンポーネント
routes/user/[id].tsx
などRouteコンポーネントでexport default async function
が書けるようになった- ハンドラーが受け取るものとほとんど一緒
- 間違いが減らせることがこの機能のメリット
- Reactのルール的に気持ち悪さがあるかもしれないけど、RouteもRSCあるので似たようなものかも?
- ちょっと独自色がある
プラグインからのMiddleware/Routeの注入
- プラグインの返り値にMiddlewareやRouteを定義できるようになった
- SEO向けのプラグインを作って、そこに
robots.txt
などのRouteを注入することができる - かなり幅が広がるはず
- プラグインマーケットも作りたくなりますね
- middlewareを生やしてOAuth認証させて、というのもできる
- Deno KV OAuthでも活用できるのでは
- 作っているメンバーにちょっと話をしてみます
その他の話題
Deno Deployで静的に解析可能なdynamic importがサポート
await import("https://example.com/")
という形式のdynamic importをサポートawait import(`https://example.com/${xxx}`)
という動的なパターンはまだサポートされていない- これで動かせるものが増えるのでは
- 動的なものはダメなのが制限としては大きな制限
- Issueで「これじゃ足りないんだ!」という人がいた
- 何をやりたいのか、いまいちわからない
- できないよりやってないが近い(やらないかも)
- かなり規模が大きい変更なので、相当明確なユースケースがないと採用が厳しい
- esm.shがDeploymentsをブッ壊すことがよくあった
- eszipに依存関係を全部固めることによって、esm.shの更新で過去に動いていたDeploymentが壊れないようにした
- evalやFunctionで擬似的な動的dynamic importができるかも……?
- Deno DeployとDeno CLIの細かな違いにハマることやよくある
質問共有コーナー
deno_stdがv1になる計画がある?
- あります
- Issueが立ってる
- やりましょう、という感じになっている
- kt3kさんがアサインされた
- ここ1年2年ほとんどのPRをレビューしているから
- 単純にバージョニングの延長でv1にするわけではない
- deno_stdの各モジュールがバージョンを持つことになり、それぞれがv1となる
- 当初としては全体でv1になる予定だった
- deno_stdのREADMEに『将来的にDeno本体とバージョンを合わせる』という記述があり、v1にすることへの異論も出た
- そもそも本体がすでにv1.0を過ぎているため
- そこまで厳密さを求めるところでもない
- READMEに書かれていたことを「プラン変えました!」は別に良いんじゃないでしょうか
- Deno本体の2.0と同時並行で進んでいる
- 2.0のときに
deno:
の話もしたい
- 2.0のときに
Deno v2のときのdeno:
について
deno:
の中身が変わりそう- publicに出てない仕様をRyanさんが構想している
- deno_stdの配信の仕方がまったく変わるかもしれない
- まったく新しいレジストリになる
- サブモジュールがバラバラになった
- サブモジュールが独自のライフサイクルになる
deno:
は元々deno_stdやdeno.land/xのエイリアスの予定だったが、それでは上手く行かなさそうということで大きな変更になりそうdeno:
はdeno_stdの取り扱いをどうするか、という問題deno:
はdeno:std:
なのでは?- そういうのもまるっと解決する
- deno.land/xはスクワッティング(居座り)問題がある
- x/typeやx/markdownなど
- これを新レジストリでは解決したい
- npmでいうところのscopedがデフォルトになる
- トップレベルはDeno管理になる
- 今はかなりドラフト状態
- この前はまったく違うアイディアを形にしようとしてた
- また新しいことを考えてガラッと変わるかも
- npmレジストリにDeno自体を乗せるというアイディアもあった
- SemVerの問題をnpm的にやれば解決する
- 自分たちでホスティングしなくていいのでインフラ代が浮く
- 自分たちでレジストリ管理ができなくなるので、データを取ることができなくなる
- 混乱のもとにしかならない、とRyanが結論づけてやめた
- Denoはnpm互換があるから動くけど、NodeはDenoモジュールを動かすことができない
- dntをしっかり噛ませてpublishしないといけない
- deno_stdやdeno.land/xが依存関係にあるモジュールをdntでpublishすると、そのモジュールをインストールしたときにDenoの依存関係をローカルのコピーに落とし込む
- そういうモジュールを複数インストールすることで、ローカルにdeno_stdなどが多重コピーされる問題が起こる
次のアップデートでDBドライバの改善予告があるのが期待
various DB drivers
と記載がある- どんなDBドライバが改善するかはBartekさんに聞かないとわからない
ポーランドの結婚指輪の話
- Bartekさんが結婚されました🎉🎉🎉
- Deno社からもお祝いの電報があったらしい
- ポーランドは右手に結婚指輪つける
- ポーランドは欧州とロシアの間に位置する
- 欧州は左、ロシアは右
- どちらに影響されているのかな、と思ったらロシア寄りだった
- 指輪文化はどこまで遡るんでしょうね
Deno DeployのChangelogで色々更新されました
Deno.serve
対応やプロジェクト作成時に14種類のフレームワークを自動認識する対応など- 今まで細かい更新情報を伝える場所がなかったので、忘れた頃にChangelogを更新というのもあるかも
Deno社として初めてのデザイナーJohnさんが入社しました
- 前職はCloudflareだった
- 入社して間もないので、今のところまだアウトプットは見えてきていない
Brick Wall
- Denoで使えるWAF
- メインアプリへの直接アクセスをさせず、Brick Wall経由でルールによってアクセス制御する
- 現状はメインアプリとBrick Wallの2つをDeno Deployにアップロードする
- メインアプリのFreshにBrick WallのMiddlewareを定義
- Brkck WallでIP制限を行なう
- プラグインからのMiddleware注入ができる場合は、メインアプリとBrick WallとBrick Wallのコントロール画面で合計3つになる想定
- Brick Wallに画面は持ちづらい
- 現在、ヘッダー持ってる持ってないでBrick Wallとコントロール画面の振り分けをしている
- 立てるのが3つになるので、できれば2つに減らしたいよね
createHandler
で静的IP制限を行ない、brickWallIpBanHandler
やipBanApiRouter
で動的IP制限を行なう- IP以外でブロックすることを思いついていない
- ここらへんもっと詳しい方いたら書いてくれると嬉しい
- Deno本体DiscordのShowcaseチャンネルに書いてみるのもいいかも
Deployダッシュボードにビルドログが見られるようになったので、デバックが簡単になった
- ビルドログの用例として使えそうなプロジェクト
- これを入れることで破壊的変更があった
- バック側の少しあとにフロント側がデプロイされたので1時間くらいダッシュボードで障害起きましたね
参考資料
上記をまとめる際に眺め、かつ箇条書きの中に含められなかった資料です。
名前だけ掠ってて関係ない資料もあるかと思いますが、まとめる作業の可視化として残しています。
読まなくて大丈夫です。
- Event Queue | Redis
- 3 Real-Life Apps Built with Redis Data Source for Grafana | Redis
- Connection Pools for Serverless Functions and Backend Services | Redis
- Redash v9 で採用されたジョブキューライブラリ RQ (Redis Queue) の基本機能を試した - kakakakakku blog
- RQ: Simple job queues for Python
- chore: simplify getSetCookies by lino-levan · Pull Request #3491 · denoland/deno_std
- DOM update 2023/06/21 by sandersn · Pull Request #54725 · microsoft/TypeScript
- deno_std/_tools/check_browser_compat.ts at e3289ed93bbef209df897f6f6df92979faf930b6 · denoland/deno_std
- deno_std/browser-compat.tsconfig.json at 0.195.0 · denoland/deno_std
- July - August 2023 iteration plan · Issue #1485 · denoland/fresh
- Marvin Hagemeister Frontend Portfolio