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.connectTlsのalpnProtocolsオプションも安定化されています。
Deno.listenTlsのalpnProtocolsオプションについては、おそらくv1.35.1で正式に安定化されるのではないかと思います。
新しいAPI
Deno.errors配下に以下の新しいエラーが追加されています:
NotADirectoryFilesystemLoopIsADirectoryNetworkUnreachable
また、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
HeadersにgetSetCookieメソッドが実装されました。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
URLSearchParamsのdelete/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-handlers | routes/に配置したコンポーネントでイベントハンドラを設定しているコードが検出された場合 |
fresh-handler-export | ハンドラが誤ってhandlerではなくhandlersという名前でexportされている場合 |
以下のようにdeno.jsonで"fresh"タグを指定することで、これらのルールをまとめて有効化できます。
{
"lint": {
"rules": {
"tags": ["fresh", "recommended"]
}
}
}
Node.js互換性
node:zlibでBrotliのサポートが追加されました。以下のAPIが実装されています。
brotliCompressSyncbrotliDecompressSynccreateBrotliCompresscreateBrotliDecompress
また、今回のリリースに伴い、Astroなどが動作させられるようになったようです。
Congrats @deno_land on shipping Deno 1.35, now with built-in Astro support! https://t.co/JZ2uXvkfVa pic.twitter.com/UuNBSQR4jB
— Astro (@astrodotbuild) July 6, 2023
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.deriveKeyにderiveBits操作が許可されたキーが与えられないとエラーが発生する問題が修正されました。- 本来であれば、
deriveKeyさえ許可されていれば、deriveBitsは許可されていなくても利用できるのが正しい挙動のようです。
- 本来であれば、
node:timers: すでにclearTimeoutが実行されたTimeoutクラスに対してrefresh()を呼んだ際に、タイマーが再作成されてしまう問題が修正されています。