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
配下に以下の新しいエラーが追加されています:
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
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が実装されています。
brotliCompressSync
brotliDecompressSync
createBrotliCompress
createBrotliDecompress
また、今回のリリースに伴い、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()
を呼んだ際に、タイマーが再作成されてしまう問題が修正されています。