皆さんこんにちは。最近ビッグゴルドバーンが自宅に届きました。おっくんです。
去る 2024 年 1 月 15 日に Deno 1.40 がリリースされました。
今回も、リリースノートを参考に 変更事項の気になるところを紹介します。
Deno 1.40
Deno 1.40 での変更事項をDeno 1.40 リリースノートを元に確認します。
Temporal API 導入
unstableなAPIとして、時間に関する機能を提供する Temporal APIが導入されました。
Temporalは、TC39で協議され現在Stage3となっているAPIです。
リリースノートを参考に、以下のように使用できます。
$ deno -V deno 1.40.2 $ deno run temporal.ts error: Uncaught (in promise) ReferenceError: Temporal is not defined const birthday = Temporal.PlainMonthDay.from("12-15"); ^ at file:///hogehoge/temporal.ts:1:18 $ deno run --unstable-temporal temporal.ts 2030-12-15 day of week 7
Deno 2 で、安定化を目指しているそうです。 Temporal APIの仕様については、TC39のページで参照することができます。
TC39提案のデコレーター を導入
このリリースから、TC39で提案されている形式のデコレーターが採用されます。 Deno 1.39 までは、TypeScriptで定義されたデコレーターが採用されていました。
TC39提案のデコレーター
TypeScriptに実装されたデコレーター
使い方が少々異なっています。動作させると以下のようになります。
$ deno -V deno 1.40.2 $ cat deco.ts // TC39 提案の形式のデコレーター function log(fn: any, context: ClassMethodDecoratorContext) { return function (...args: unknown[]) { console.log(`call ${context.name.toString()} with ${args}`); fn(args); console.log(`called ${context.name.toString()} with ${args}`); }; } class Target { @log method(src: number) { console.log(`method with ${src}`); } } const target = new Target(); target.method(1); # デコレータで記述したように Target::method の実行内容の前後にコンソール出力が追加されます。 $ deno run deco.ts call method with 1 method with 1 called method with 1 $ deno -V deno 1.39.4 # Deno 1.39 で動作させると出力の内容が違ってきます $ deno run deco.ts method with 1
同一のコードをTC39形式のデコレーターとTypeScriptのデコレーターの間では、解釈が異なるために出力が違ってきています。 また逆も然りで、TypeScript形式のデコレーターは、TC39形式形式の解釈されたとき、そのままでは動かない可能性があります。
もし引き続きTypeScript形式のデコレーターを使い続けたい場合には、deno.jsonに以下の記述を追加し実行します。 確認します。
$ cat deno.json { "compilerOptions": { "experimentalDecorators": true } } $ deno -V deno 1.40.2 # Deno 1.40でありながら、Deno 1.39同様のTypeScript形式の解釈がされた表示になる。 $ deno run deco.ts method with 1
WebGPU ウィンドウ化 / 「Bring your own Window」
ウィンドウ処理をするためのunstableなAPI、Deno.UnsafeWindowSurface APIが追加されます。 ネイティブウィンドウまたはディスプレイハンドルを使ったWebGPUサーフェスを作成します。
以下のようなFFIを使いウィンドウを操作するモジュールやクレート他で使用する事ができる低レベルAPIです。
紹介はされていますが、現在のところ、Deno.UnsafeWindowSurface
が使用されているのは、sdl2のみです。
見やすいレポートへの変更
deno lintとdeno docの表示形式が新しくなりました。
deno lintでは、Deno 1.39と比較すると以下のように表示が異なります。
$ deno -V deno 1.39.4 $ deno lint lint_target.ts (no-empty) Empty block statement while (true) {} ^^ at /hogehoge/lint_target.ts:1:14 hint: Add code or comment to the empty block help: for further information visit https://lint.deno.land/#no-empty Found 1 problem Checked 1 file $ deno -V deno 1.40.2 $deno lint lint_target.ts error[no-empty]: Empty block statement --> /hogehoge/lint_target.ts:1:14 | 1 | while (true) {} | ^^ = hint: Add code or comment to the empty block docs: https://lint.deno.land/#no-empty Found 1 problem Checked 1 file
その他、次の3つのルールが利用可能になるなどの更新が入っています。
APIの整理
Deno 2に向けて、多数のAPIの非推奨への変更と安定化、1件の削除が実施されています。
削除となったのは、Deno.upgradeHttp
です。
移行先として、Deno.serve()
とDeno.upgradeWebsocket()
が推奨されています。
非推奨と安定化されたAPIは多数あるため、詳細はリリースノート本体をご覧ください。
Web API rejectionhandled イベントのサポートを追加
reject 済みのPromiseに.catch()
ハンドラがアタッチされると発火するrejectionhandled
イベントがサポートされました。
リリースノート掲載のサンプルは、次のようになっています。
globalThis.addEventListener("unhandledrejection", (event) => { event.preventDefault(); console.log("unhandledrejection", event.reason); }); globalThis.addEventListener("rejectionhandled", (event) => { console.log( "A .catch() handler was added to the promise after it has already rejected.", event.reason, ); }); const a = Promise.reject(new Error("boom!")); setTimeout(async () => { await a.catch(() => console.log("Added catch handler to the promise")); }, 10);
実行すると次のようになります。
$ deno fmt rejectionhandled.ts
unhandledrejection Error: boom!
at file:///hogehoge/rejectionhandled.ts:13:26
Added catch handler to the promise
A .catch() handler was added to the promise after it has already rejected. Error: boom!
at file:///hogehoge/rejectionhandled.ts:13:26
その他
- Node.js APIの更新として、組み込みNode APIの拡充と、バグ修正
- import.meta.filename、import.meta.dirname の2つのAPIを追加
- deno.jsonに記述するimportsの記述が簡単になり、サブパスも単一の記述で対応できるようになった
- LSP(言語サーバー)の改善
- deno lint に新しいルールが入るなどの更新
今回のリリースでは、Deno 2 にてのTemporal APIの安定化や、各種API群の安定化/整理の動きが起きています。 2月2日には、「Deno in 2023」という2023年のDeno の動きを総括した記事も公開されています。
この中で、Deno 1.x からDeno 2.x への移行ガイドというものも紹介されています。
いよいよという雰囲気が感じられます。
今、マイルストーンとしては1.41が用意されているので、もう数回1.x系のアップデートもあるのでしょう。
また次回も追いかけたいと思います。
toranoana.deno #15
Deno に関することであれば何でもOKのLT会、toranoana.deno 次回は2月14日開催です。
登壇参加、視聴参加大歓迎です。
採用情報
虎の穴ラボでは一緒に働く仲間を募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧ください。
toranoana-lab.co.jp