Denoばた会議 Monthly 第26回
2024年3月1日開催。
connpassリンク。
今月のアップデートを追う
Denoのアップデートを追っていくLT。
そのあとの雑談込みでザックリと箇条書き。
Deno v1.40
Temporal APIサポート
--unstable-temporal
を指定すると、Temporalのサポートが有効化される- 新しい日付系API
- カッチリと正しく定義されている印象
- Moment.jsやdate-fnsみたいなお手軽さはない
- 差分を取るなど高レベルなこともできるけど、名前つけのクセがJavaっぽい
- TypeScriptの補完があればまだ大丈夫そうだけど、なしだとキツイかも
Temporal.Instant
はあまり使わないで、Temporal.ZonedDateTime
を使う感じになりそうTemporal.Instant
だとISOになる
- まだunstableなのでDeno Deployでは使えない
Decorators proposal (stage 3)
のサポート
- 現状は
.ts
などのトランスパイルされるファイルでのみ動作する - TypeScriptの
experimentalDecorators
を利用したい場合deno.json(c)
のcompilerOptions.experimentalDecorators
にtrue
を設定する
- フレームワークが古いものを使っているので、以前のDecoratorsを使っているパターンがある
- Recomposeのときに
@compose
と書いていた記憶 - NestJSが多用している記憶
- DanetはDecoratorsを多用している
- Alosaurは古いDecoratorsを使っていたが、v1.0.0で移行した
- おそらくここが一番早い
- Javaのような依存性注入(DI)をしたいときはこの手法だよね
- これで最終仕様になったので、安心して使えます
Import maps expansion
msw
配下のmsw/node
のようなサブパスを読み込む挙動の改善- 今バージョンから、
npm:msw@2.0.8
とdeno.json(c)
のimports
に記載するだけでサブパスも読み込まれるようになった- 以前は
npm:/msw@2.0.8/
と一緒に記載する必要があった - 今までの書き方は特殊で認知度が低いかも
- 以前は
- Import mapsのそもそもの仕様とは異なる
- ブラウザが解釈できるImport mapsとは別の代物になる
- 利便性は向上した
v2に向けた非推奨化
- unstable全体を有効化する
--unstable
が非推奨化--unstable-*
やdeno.json(c)
のunstable
オプションに移行推奨
window
が非推奨化globalThis
やself
に移行推奨- 将来的に導入予定の機能を先行体験できる
DENO_FUTURE
環境変数を設定すると削除される - 今まではNodeに対応していなかったので、Nodeとブラウザ両方に対応したモジュールはブラウザの分岐に逃がすために存在してた
- Node互換対応によって、今度は
window
が挙動の邪魔をするようになった
Deno.Reader
&Deno.Writer
- 昔からあるReader/Writerのこと
- やるやるって言ってたのに誰も作業しないから放置されてた
- Asherさんという非推奨大好きな人が非推奨化した
- Deno Offsiteのときに来日して、Deno社員向けのディナーにもねじ込んできた行動力ある人
- deno_stdで非推奨をしまくってたけど、ついにやるものがなくなったのでDeno本体でも非推奨化作業を始めた
- そういう作業をしてくれる人はそんなにいない
- 一時的にはそれで被害を受けたりする人がいるので、文句が来ることもある
- 恨みを買いやすい作業でも率先してしてくれる存在はありがたい
rid
- リソースIDが隠れたような感じで利用できるようになってきたので非推奨になった
External WebGPU surfaces / BYOW (Bring your own Window)
- バッファのレンダリングをWebGPUで高速に処理するようなもの?
- Deno自体は画面になにか描画するものは持っていないが、WebGPUは提供している
- ユーザー側で画面とガッチャンコすれば使える感じ
- 以下のモジュールで活用されている
Deno v1.41
パッケージシステム(JSR)関連のアップデート
deno lint
にno-slow-types
ルールが導入された- JSRパッケージに対して
fast check
を実行してくれる - シグネチャの型定義の省略を検知して知らせる
- JSRパッケージに対して
deno publish
で型チェックが自動実行がサポート
deno compile
でdenort
バイナリが再導入
- かつて削除されたが、再導入された
- かつては
deno compile --lite
として使えていた deno fmt
などを消して必要なランタイムだけ抜き出したのがdenort
だった- これの管理が大変だったので、一度削除された
- かつては
deno compile
によって生成される実行可能ファイルのサイズが大きく削減されている- デフォルトで
denort
でコンパイルされる- 環境変数でバイナリのパスを指定すると全部入りもできる
- 全部入りはあまり推奨されていなさそう
- モチベーション
- 少し前に必要なものだけ残したカスタムのバイナリを用意する予定と言っていたので、それで新たに入ったのかも?
- deno-lambdaの強化もあったので、それも関連してるかも
- AWS Lambdaはバイナリサイズが起動時間の長さに関わってくるので、そこを縮めたかった狙いがあるかも
- AWSが専用のランタイム(LLRT)をリリースした関係もある?
- JavaScriptエンジンがQuickJSで、すごく小さい
- 起動がメチャクチャ早い
- 量を捌くタイプではなく起動が早いことを重視
- 広い意味ではLLRTとやりあう感じになるが、V8を使っている時点で張り合えないので、AWS Lambda上のNode.jsよりは早く動きたいねという感じ
- LLRTはサイズが小さすぎるし、向いている方向性が違う
- 起動後はリクエスト数が多ければ、JITがあるV8に軍配が上がるのでは
process.env
の挙動の変更
--allow-env
で指定されていないprocess.env
の環境変数があれば、パーミッションプロンプトが表示される- 許可ないものとして挙動していたので、変な挙動していた
- Chalkとか
process.env
の許可なし挙動の影響で、「この環境は色がつけられない!」という挙動になっていた- ChalkをNode互換性で動かそうとしたら発生する
- Deno FestでのRyanさんの基調講演で同様のハプニングが起きた
その他の話題
JSR
- waitlistが公開された
- 今はwaitlistがない
- JSRのリリース日が3/1(つまり今日)
- オランダでDevworld Conference(日本で言うデブサミ)という大規模イベントがあり、日本時間9時半にRyanさんがJSRについて話し、正式公開をアナウンスする
- deno-postgresはすでに公開されている
- 今後は、
deno.land/x/postgres
からjsr:@bartlomieju/postgres
に主流が移っていくだろう - Scopeが
@denodrivers
ではなく@bartlomieju
なのは、Bartekさんがそう望んだかららしい
- 今後は、
- GitHub Organizationも公開されている
deno.land/x
のモジュールをJSRパッケージに変換する@deno/x-to-jsr
もJSRに公開済み- npmにもJSR CLIがリリース済み
- 2文字Scopeの人とかいて微妙な感じ
- 2文字Scopeはなくてもよかったかも
- Scopeは3つしか取れないけど、その配下にはいくらでも登録できる
- AWSなど著名なScope名は予約されていて、第三者が登録できないようにしている
@google
が登録されているけど、正しい人に渡っているか不明
- Scopeなしのトップレベルは審査制にしようか検討中
- 『トップレベルは素性がわかっているもの』という感じにしたい
Hono v4がリリース
- マルチランタイムのOSS
- Perlを軸としたYAPCのトップバッターがこれのリリースだったの面白い
- SSGサポート
- Client Coomponents (hono/jsx/dom)
- ReactのようなuseStateなどの実装
- 実装としては自前
- 実装者いわく、Reactは見てないらしい
- HonoX
- Expressの立ち位置からNext.jsの立ち位置になった
- yusukebeさんはMojoliciousに携わっていたのでExpress的なレイヤーには詳しく、そのレイヤーでのHonoの立ち位置を考えていた
- 今後、Next.js的な立ち位置で大規模な採用をされたときの対応とか、そういうのが求められたときにどうなるのか気になる
- Denoもバンドラをやっているとユーザーの要望を拾いきれないため廃止するなど、やることの選択をしている
LumeCMSがリリース
- コンテンツのプレビューや編集などがサポート
- HonoやDeno KVなどが使われている
- アダプターを作ればLume以外でも利用できるらしい
- オープンなものでセルフホスティングするタイプ
- 将来的にサービス化するのかも?
- CMS SaaSはレッドオーシャンなので、どうなるのか注目
Denoハンズオン&もくもく会:Fresh + KV
- 2024年3月2日に開催
- なのでレポートが出てる頃には終わってます
- 枠いっぱいになってるので、希望者いれば枠増やすとか管理者が枠から抜けたりして対応しますのでお気軽にどうぞ
- 以下の3つをハンズオン
- Fresh + Deno Deployで簡単なWebサイトをPublishしてみよう
- Deno KVを使ってWebサービスを作ってみよう
- Freshのislandアーキテクチャって何?
- もくもく会も併設
Denoのリリースサイクルの話
- いつの間にか6週間になっていたが、また4週間に戻った
質問共有コーナー
hajimesan_さんのDeno利用例について
使用感
- v1がリリースされて少ししたときに、ローカルでスクリプトを動かしたくらい
- 勤務している会社のプロダクトに、スクリプトとして突っ込んでいる
- Node.jsのWorkspace内に配置されている
- サーバーで動かすコードは入っておらず、フロントエンドとユーティリティのみ
- その中にローカルでシュッと動かすツール群があり、それがDeno製
- NOT A HOTELさんと同じような使い方
- サーバーがCloudflareでツール系がDenoだった
- Denoは
compilerOptions
を拡張する必要がないので設定が少なくて済むし、deno fmt
などがある - Vitestで書かれていたものを
Deno.test
に置き換えたりしている - Node.jsのESM移行が終わり、Jestだと厳しかったのでVitestに移行したが、そこから部分的に移行した
- サードパーティモジュールへの依存を減らすことができた
つらいこと
- モノレポ構成で
deno.json(c)
とpackage.json
が同居していると、LSPが少し歯痒い感じがある- プロジェクトルートに
import_map.json
を置いて依存関係をすべてそこに書き、.vscode/config.json
でそれを読んで、配下のdeno.json(c)
でimport_map.json
を読むようにしている package.json
とdeno.json(c)
が衝突する問題はDENO_NO_PACKAGE_JSON=1
を設定したりすると、もしかしたら回避できるかもしれない- Deno Docsは
src-deno/
にDenoのソースを置いている
- プロジェクトルートに
- Denoチーム自体はNode.jsとDenoの混在をあまりしていないため、そういう知見はありがたい
- モノレポ構成のTipsを記事として書いていただけるとありがたい
- モノレポ構成については割とmizchiさんの記事で書かれている印象がある
DenoのWorkspace実装について
- Workspaceについての実装が一旦追加されて削除された?
- Workspaceは内部的にはやりましょうになっている
- deno_stdはWorkspaceで動いているので、実行自体はされている
- 公式のリリースはされてないかも
- みんなが思うWorkspaceになるかは、Davidさんの匙加減次第
deno fmt
を作っている方
bidというIMEユーザー辞書統一出力ツールを作った
- IMEユーザー辞書のフォーマットがバラバラなので、統一したフォーマットから各IMEに合わせたフォーマットに出力するツール
- Google IMEやmacOS IME、MS IMEといった主要なIMEに対応済み
- 一つのファイルから各IMEに合わせたユーザー辞書ファイルを生成し、配布することができる
- 10人規模の同人サークルに所属していて、そこの用語管理のために制作
- 用語の多い会社組織での利用を想定して、CSV入力の対応やExcel実例 資料の追加を行なっている
- 略した入力をするとき(『めーるあどれす』で特定のメールアドレスに変換)にも活用できそう
Fresh Gardenというログイン機能を生やすものを作った
- 最初はFresh Plantationだったが、アメリカでは別の意味合いを含むという指摘があり、現在の名前になった
- Deno Deployでは超限定的な状況でしか動的インポートができない
- 超限定的な動的インポートを再現する方法を導入時に案内している
- 静的なインポートをするとバンドルに含まれるので、動的インポートが効く
- 毎週月曜0時に最新のFreshで動作するかテストしている
- ユーザー認証をするサーバーがほしいので、テストのときにDockerを立てている
- 他の方の参考になれば
JSRのエンタープライズ利用について
- JSRはオープンソースに公開されている
- Dockerでセルフホストすることもできる
参考資料
上記をまとめる際に眺め、かつ箇条書きの中に含められなかった資料です。
名前だけ掠ってて関係ない資料もあるかと思いますが、まとめる作業の可視化として残しています。
読まなくて大丈夫です。
- Release v1.40.0 · denoland/deno
- React×HOC環境を支援する、Recompose入門
- Stage 3 Decorators - uki00a
- <script type="importmap"> - HTML: HyperText Markup Language | MDN
- Signature (functions) (シグネチャ (関数)) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN
- 2024/02/12〜2024/02/18の最新情報 | 週刊Deno
- 【toranoana.deno#15】WebGPUで遊ぼう - Speaker Deck
- Deno Fest 特設サイトのソースコードを公開しました - 虎の穴開発室ブログ
deno bundle
が非推奨になったので代替手段(swc、esbuild) #JavaScript - Qiita- Proposal: deprecate
deno bundle
, adddeno pack
· Issue #15463 · denoland/deno - feat(unstable): remove --unstable-workspaces flag by bartlomieju · Pull Request #21891 · denoland/deno
- XユーザーのYoshiya Hinosawaさん: 「@windchime_yk いえ、逆にフラグをつけなくても workspace 機能を使えるようにする、という変更ですね (依然として unstable 機能ではあるもののフラグの後ろに隠す意味がないという判断のようです)」 / Twitter
- feat: add
DENO_NO_PACKAGE_JSON
env var by dsherret · Pull Request #17926 · denoland/deno - deno_std/_tools/convert_to_workspace.ts at 0.218.2 · denoland/deno_std
- build: update _ to - in workspace converter script by lucacasonato · Pull Request #4357 · denoland/deno_std