虎の穴開発室ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

Deno 1.40 へのアップデートと変更事項まとめ

皆さんこんにちは。最近ビッグゴルドバーンが自宅に届きました。おっくんです。

去る 2024 年 1 月 15 日に Deno 1.40 がリリースされました。
今回も、リリースノートを参考に 変更事項の気になるところを紹介します。

Deno 1.40

Deno 1.40 での変更事項をDeno 1.40 リリースノートを元に確認します。

deno.com

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.es

TC39提案のデコレーター を導入

このリリースから、TC39で提案されている形式のデコレーターが採用されます。 Deno 1.39 までは、TypeScriptで定義されたデコレーターが採用されていました。

TC39提案のデコレーター

github.com

TypeScriptに実装されたデコレーター

www.typescriptlang.org

使い方が少々異なっています。動作させると以下のようになります。

$ 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.com

この中で、Deno 1.x からDeno 2.x への移行ガイドというものも紹介されています。

docs.deno.com

いよいよという雰囲気が感じられます。

今、マイルストーンとしては1.41が用意されているので、もう数回1.x系のアップデートもあるのでしょう。

また次回も追いかけたいと思います。

toranoana.deno #15

Deno に関することであれば何でもOKのLT会、toranoana.deno 次回は2月14日開催です。
登壇参加、視聴参加大歓迎です。

yumenosora.connpass.com

採用情報

虎の穴ラボでは一緒に働く仲間を募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧ください。
toranoana-lab.co.jp