Deno v1.35がリリースされました。

この記事では主な変更点などについて解説します。

Deno API

Deno.serveの安定化

Denoに組み込まれたHTTPサーバを起動するためのAPIであるDeno.serveが安定化されました。今後は--unstableを指定しなくても利用できます。

const ac = new AbortController();
setTimeout(() => ac.abort(), 10000);

const server = Deno.serve({
  signal: ac.signal,
}, (req) => new Response("Hello Deno!"));
await server.finished;

これに合わせて、Deno.connectTlsalpnProtocolsオプションも安定化されています。

Deno.listenTlsalpnProtocolsオプションについては、おそらくv1.35.1で正式に安定化されるのではないかと思います。

新しいAPI

Deno.errors配下に以下の新しいエラーが追加されています:

  • NotADirectory
  • FilesystemLoop
  • IsADirectory
  • NetworkUnreachable

また、Deno.AtomicOperationが公開されています (今までは型定義のみが公開されていて、Deno名前空間では実際には定義されていませんでした)

Web API

ReadableStream.from

ReadableStream.fromが実装されました。AsyncIteratorなどからReadableStreamを作成することができます。

function sleep(ms) {
  return new Promise((ok) => setTimeout(ok, ms));
}
async function* gen() {
  for (let i = 0; i < 5; i++) {
    await sleep(i * 1000);
    yield i;
  }
}
const readableStream = ReadableStream.from(gen());
for await (const i of readableStream) {
  console.info(i);
}

Headers#getSetCookie

HeadersgetSetCookieメソッドが実装されました。Set-Cookieヘッダーを取得する際に使用することが想定されています。

const headers = new Headers();

headers.append("Set-Cookie", "a=1; Secure");
headers.append("Set-Cookie", "b=1; HttpOnly");

headers.getSetCookie(); // => [ "a=1; Secure", "b=1; HttpOnly" ]
headers.get("Set-Cookie"); // => a=1; Secure, b=1; HttpOnly

URLSearchParamsdelete/hasで2引数形式がサポート

const params = new URLSearchParams();

params.append("foo", "1");
params.append("foo", "2");
params.getAll("foo"); // => [ "1", "2" ]

params.has("foo", "1"); // => true
params.has("foo", "3"); // => false (1.34だとtrue)

params.delete("foo", "2"); // foo=2のみを削除します
params.delete("foo", "4"); // 1.34だと全てのfooパラメータが削除されます

params.getAll("foo"); // => [ "1" ]

deno lsp

以下に対するimportの自動挿入がサポートされました。

  • npmパッケージ (npm:URL)
  • Import Mapsでマッピングが定義されているモジュール

deno lint

freshアプリケーション向けに、以下の2種類のルールが追加されています。

ルールエラー発生条件
fresh-server-event-handlersroutes/に配置したコンポーネントでイベントハンドラを設定しているコードが検出された場合
fresh-handler-exportハンドラが誤ってhandlerではなくhandlersという名前でexportされている場合

以下のようにdeno.json"fresh"タグを指定することで、これらのルールをまとめて有効化できます。

{
   "lint": {
     "rules": {
       "tags": ["fresh", "recommended"]
     }
   }
}

Node.js互換性

node:zlibでBrotliのサポートが追加されました。以下のAPIが実装されています。

  • brotliCompressSync
  • brotliDecompressSync
  • createBrotliCompress
  • createBrotliDecompress

また、今回のリリースに伴い、Astroなどが動作させられるようになったようです。


https://twitter.com/astrodotbuild/status/1677075022622621696

TypeScript

Deno内部のTypeScriptがv5.0.4からv5.1.6へアップデートされました。

Lockfile

d.tsファイルについては、ハッシュ値がlockfileに書かれないように挙動が変更されました。

バグ修正

  • いくつかのグローバルAPIをglobalThis経由で参照した際に、型エラーが発生する問題が修正されています。

    new globalThis.Response("foo"); // v1.34だと型エラー
    
  • crypto.subtle.deriveKeyderiveBits操作が許可されたキーが与えられないとエラーが発生する問題が修正されました。

    • 本来であれば、deriveKeyさえ許可されていれば、deriveBitsは許可されていなくても利用できるのが正しい挙動のようです。
  • node:timers: すでにclearTimeoutが実行されたTimeoutクラスに対してrefresh()を呼んだ際に、タイマーが再作成されてしまう問題が修正されています。

参考