Denoばた会議 Monthly 第10回
2022年6月19日開催。
connpassリンク。
今月のアップデートを追う
Denoのアップデートを追っていくLT。
そのあとの雑談込みでザックリと箇条書き。
Deno v1.23
deno run
やdeno cache
などのコマンドで型チェックが無効化
- 型チェックを行いたい場合は、
deno check
コマンドを使う必要がある deno test
やdeno bundle
などのコマンドでは、引き続き型チェックが行われる- RustのSWCでコンパイルしているが、これの影響が出ているよう
--check
フラグをつければ解決する- ワークアラウンドとしては微妙
- なんらかの関数コールが再帰して無限ループになったという話もあった
APIの削除
Deno.sleepSync
(unstable API)
- Atomics.waitで代替可能
- Node.jsでも動いた
- ブラウザで動かそうとしても動かない
- Web標準だが実行環境が限られている
- Workerで動かすものなので、メインスレッドで動かない
- アイソモーフィックな(クラサバ同一で動く)実装ではないので注意
- SharedArrayBufferはセキュリティ上の理由でブラウザではデフォルトで無効化している
- 元々は標準化させる予定だった
- Ryanさんから「これはアンチパターンだから必要ない」という意見があり、消すことになった
- 社内でも意見が割れていた
- サーバー側でサーバーのリクエストが止まるので良くないという話
- CLIなどでは使い所があるので、fmt作っている人が「使い所ある」と言っていたが、削除に倒れた
- deno_stdにヘルパー関数のIssueが立っている
- sleepSyncをするのを諦めるのが一番のワークアラウンド
setTimeout()
をPromiseで包んでawaitで待つという手法もある
Intl.v8BreakIterator
(非標準のAPI)
- Intl.Segmenterで代替可能
- 形態素解析してくれるWeb標準API
- 便利なので使っていきましょう
Worker内でのDeno.exit()
の振る舞いが変更
Deno.exit()
がWorker内ではself.close()
と同様の振る舞いを行うように変更された- 実行されたらWorkerが閉じる
- 自然な挙動になった
- プロセス全体を閉じてしまっていたので、この変更だけでWorkerだけが閉じるようになった
TypeScript v4.7へのアップデート
- Denoの内部で使用されるTypeScriptのバージョンがv4.7へアップデート
- これに関連して、
deno fmt
コマンドでcjs
/cts
/mjs
/mts
拡張子がサポート - Denoの内部で
"moduleDetection": "force"
オプションが有効化 - Node.jsモジュール周りが強化されている
- ほとんどDenoは関連してない
- 新しいオプション
moduleDetection
がDenoで設定されているくらい - TypeScriptが
cjs
かmjs
かの判断を変えられる auto
はpackage.json
の中身を見て決めるcjs
がなくてESM前提なのでforce設定になっているfetch
の引数がstring
かURL
かrequest
になった- Denoは昔それを勝手にやってTypeScriptと食い違いが発生して非推奨にしたことがある
package.json
のmoduleタイプがあれば不要なのでは- あんまり流行らなさそう
- なんか拡張子爆発が起きている気がする(
cjsx
とかmjsx
とか言い始めたら切りがない)
deno task
コマンドの改善
- リダイレクション(
>
などの標準入力や出力の変更)がサポート cat
やxargs
コマンドが実装deno task
の中身はdeno_task_shellというRust製Shell実装がされている- SystemのShellに依存しない
- Windowsでも動く
CompressionStream
とDecompressionStream
で"deflate-raw"
フォーマット(Deflateアルゴリズム)がサポート
- 今まではgzipとdeflateがあった
- そこに新たに追加された
- MDN側に反映されていないけど、最近Web標準に実装された
- メタ情報がつくかどうかの違い
- Web Platform Testはもうある
- それに合わせてテスト修正
- flate2というRust Crateを使っている
- 実装PR
- 実装している人はDenoLandの新メンバー(6月1日から)
- 社内チャットには5月中盤からいた
- 入社する話が出るまでDenoにコントリビュートしてない
- Denoの若いメンバーと仲が良く、実力として間違いないという話で入った
- 今までのコントリビュータから入るパターンとは違うパターンで入社した
FFI(Deno.dlopen
)でBigInt
がサポート
- ネイティブで64bitで呼ぶやつは今までNumberだったが、64bitが扱えてなかった
- そのまま返ってくるとバグる
- Bigintに対応して回避
- 実装PR
- 4回stale botに閉じられそうになってる
(Windows) Deno.addSignalListenerでSIGINTとSIGBREAKシグナルがサポート
- Ctrl+Cに対応(WindowsはSIGINT)
- SIGBREAKはMacとLinuxがない(Windowsだけ)
- Ctrl+Breakが対応
Deno.Child.killの引数が省略可能に変更
- 省略したときはSIGTERMが送られる
- SIGTERMはKillのシグナル
- 実装MR
deno_stdのアップデート
std/media_typesの追加
- oakserver/media_typesがdeno_stdに追加
- deno_stdに元々あったが削除され、oakserverでメンテナンスされていたがまた戻ってきた
contentType()
に"application/json"
を渡すと文字コードつきで返ってくるのはいらないのでは? と言ったら「oakこれに依存してるからヤダ」って言われたのでそのまま入った
- その他にも、oakserver/commonsでメンテナンスされているいくつかの機能のdeno_stdへの移植が行われている
- HTTPエラーなど
- kitsonの個人ロードマップでcommonsにあるものでstdに入れても良さそうなのはどんどんいれるという方針になってる
- あれば便利だけどなくても困らない(これなくても自前で実装する人はいそう)
std/encoding/front_matterの追加
- Web標準はないけど使用頻度が高いパターンが一般化してる
Deno Deploy Beta 4
- 有料のProプランが公開
- ダッシュボードがリニューアル (メトリクスの可視化、ログの改善など)
- 2022年のQ3でGA版がリリース予定
- Freeプランは日毎10万リクエストまで
- チャットbot系でもそこまでいかないので、Freeプランで充分
- 趣味アプリをデプロイする場所としては引き続きFreeで問題なさそう
- ProプランではWildcard subdomainsが利用できる
*.deno.dev
みたいに設定できる- サブドメインを発行するようなSaaSを作るときに使える
- Proの月額が高めになってる(Cloudflare Workersの2倍)
- 超過金はCloudflare Workersの4倍
- なんで高いのか
- インフラのコストでDeno Deployどうするかという計算をしたら、Cloudflare Workerと同じプランだと成り立たない
- 超大規模に使うと損になる
- 残念といえば残念な設定
- これが最終というわけではない
- 今乗っているプロバイダを乗り換えれば安くできるかも
- Xiaさん(Aleph.jsの人)がデザインした
- ダッシュボードはAleph.jsで作られている
denoland/showcase_chat
- Deno公式でチャットアプリの実装例が公開
- FreshやSupabase、Twindなどを使用して実装されている
- Deno的にTwilwind CSSは相性がよくて、オススメ
- Chatチームの4名が制作した
- Showcaseプロジェクトはサイドプロジェクト感があり、時間が取れないメンバーもいる
- Webサービスを作るスキルセットを持っていないとなかなか着手されないという問題がある
- Meet Meはkt3kさんほぼ一人でやってる
Fresh v1.0のロードマップが公開
- Preactのバージョンのカスタマイズ
- FreshをDenoオーガナイゼーション配下へ移動
- 海外ではHacker Newsの上位に来るかでプレゼンスを測っている
- 突如としてHacker Newsでバズって400コメント以上がきた
- Aleph.jsも順位少し低めだけど同時期
- Freshは割と公式扱いになってる
DenoのYoutubeチャンネルでイベントの動画が公開
- DenoのYoutubeチャンネルでMelbJSやRemixConfなどでの発表内容が公開されている
- Andyさんがここらへんやってくれている気がする
- BertekさんがYouTubeついてよく言及していた
- Podcastもあって、露出を増やしている感じ
enジャパンが運営するエンジニアHubでkt3kさんのDeno入門記事がリリース
- Supabaseと繋いだWebサーバーをDeno Deployにデプロイするまでができる
- サンプルにはnanossrを使っている
- nanossrはTwindがビルドインになっている
- サンプルを短くするように頑張った
- Deno Deployに上げるまでをやりたかったので、ローカルに上げると書き込みができないSQLiteよりPostgresを採用している
- ブラウザのフォーム機能を使っている
request.formData()
で受け取れる- 303リダイレクトで同じ画面にリダイレクトして書き込むように見せている