Deno v1.26.1

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

Node-APIの実装

DenoでNode-APIが実装されました。

Node-APIで実装されたアドオンのrequire()での読み込みがサポートされます。

Node-APIを有効化するためには、今のところ、--allow-ffiの指定が必要なようです。 (ただし、将来的にオプションが変わる可能性はあるようです)

いまのところ、lightningcsslz4-napiなどが動作することが確認されているようです。(napi-rs/napi-rs#900)

Node.js互換に関する改善

Node-APIの実装以外に関する改善として、npm:経由で読まれたパッケージの依存関係の解析結果がキャッシュされるようになりました。

これにより、キャッシュが存在する場合は、Viteの起動が3倍近く高速化されているようです。

キャッシュの仕組みはSQLiteをベースに実装されており、$DENO_DIR/node_analysis_cache_v1にデータベースが作成されます。

その他の改善として、deno cacheでのnpm:のサポートやrequire()でのJSONファイルの読み込みなどがサポートされています。

Web Cache APIのバグ修正

Deno v1.26で追加されたCache APIに関するバグ修正が実施されています。

  • Cache.put()に渡したResponseオブジェクトがconsumed状態にならない問題が修正
  • Cache.put()に渡したResponseに紐づくReadableStreamの読み込みでエラーが起きると、リソースリークが発生する問題が修正
  • Cache.put()で書き込みに失敗したときに、中途半端にキャッシュが保存されないように改善

その他の修正

  • --unstableを付けないと、Deno.hostname()undefinedになる問題が修正 (Deno.hostname()Deno v1.26で安定化されています)
  • リクエストボディの読み込みが最適化 (perf(ext/fetch): consume body using ops (#16038))
  • 一度、Request#text()などでリクエストボディを消費したにも関わらず、再度Request.bodyを参照するとRequest.bodyUsedfalseに戻ってしまう問題が修正
  • Deno.serve()で、ステータスコードが204の際はContent-Lengthが設定されないように修正
  • SubtleCrypto.deriveBits()length引数に与えられた長さが考慮されない問題が修正

https://github.com/denoland/deno/releases/tag/v1.26.1

deno_std v0.159.0

deno_std v0.159.0がリリースされました。

std/textprotoの非推奨化

以下の理由などから、std/textprotoが非推奨化されました。

  • 現在はdeno_stdの内部で使われていないこと
  • deno_stdの方針として、GoスタイルのAPI(Deno.Reader/Deno.Writer)からWeb Streams APIベースへ移行されていること

今後は、このモジュールの使用は避けることが推奨されます。

std/streams/conversion: iterateReaderのバグ修正

iterateReaderに長年存在していたバグが修正されています。

具体的な修正内容については、以下の記事で詳細に内容が解説されています。

また、この修正に関連してiterateReader()の実装が効率化されています。(perf(streams): memory optimizations by avoiding large buffer allocation in a loop (#2748))

std/collections/partitionの型定義の改善

以下のように、partitionの第2引数にtype predicateを指定した場合、戻り値のそれぞれの配列の型が推論されるように型定義が改善されました。

const values = [1, "23", 456, "789"];
const [numbers, strings]: [Array<number>, Array<string>] = partition(
  values,
  (x) => typeof x === "number",
);

std/http/file_serverの改善

  • serveDir()showIndexオプションが追加されています。
    • falseを指定すると、リクエストでディレクトリが指定された際のindex.htmlの自動配信が無効化されます。
  • #などの予約後を名前に含むファイルがうまく配信されない問題が修正されています。

std/nodeの改善

大きな変更として、Deno本体の--node-modules-dirオプションをベースにchild_process.fork()が再実装されています。

その他には、hash.digest()での'base64url'のサポートの追加や、tls.TLSSocket/fs.open()/child_process.spawnSync()の互換性の向上などが実施されています。


https://github.com/denoland/deno_std/releases/tag/0.159.0

denoland/apiland

以下のリポジトリでdeno.landのバックエンドのソースが公開されました。

Denoに加えて、Google Cloud Datastore/Algoliaなどを活用して開発されているようです。

【TypeScript】Deno で匿名掲示板を作ろう! with upstash & supabase

Deno Deploy/Fresh/Supabase/Upstashなどを活用して匿名掲示板を作る連載記事が公開されています。