Deno v2.7.5

Deno v2.7.5がリリースされています。

--cpu-prof

--cpu-prof, --cpu-prof-dir, --cpu-prof-name, --cpu-prof-interval, 及び--cpu-prof-mdオプションが追加されています (#31909)

あわせて公式ドキュメントの追加も実施されています (docs: add CPU profiling section to debugging page (#2962))

--cpu-profオプションを指定すると、CPUプロファイラーが有効化され、プロセス終了時にデフォルトでカレントディレクトリにCPUプロファイルが保存されます (デフォルトで CPU.<timestamp>.<pid>.cpuprofile という名前で保存されます。--cpu-prof-dirオプションで出力先ディレクトリ、--cpu-prof-nameオプションでファイル名をカスタマイズ可能です)

$ deno run --cpu-prof --cpu-prof-name=cli.cpuprofile -R src/cli.ts

$ file cli.cpuprofile 
cli.cpuprofile: JSON data

また、--cpu-prof-md オプションを指定すると、プロファイル結果をMarkdown形式で出力してくれます。

$ deno run --cpu-prof-md --cpu-prof-name=cli.cpuprofile -R src/cli.ts

$ cat cli.md
# CPU Profile

| Duration | Samples | Interval | Functions |
| --- | --- | --- | --- |
| 414.49ms | 29 | 1000us | 90 |

**Top 10:** `scanNext` 20.0%, `firstString` 10.0%, `cache` 10.0%, `op_require_real_path` 10.0%, `compileFunction` 10.0%, `normalizeString` 10.0%, `findNodeAtLocation` 10.0%, `onLiteralValue` 10.0%, `lintText` 10.0%

## Hot Functions

| Self% | Self Time | Samples | Function | Location |
| ---: | ---: | ---: | --- | --- |
| 20.0% | 2.00ms | 2 | `scanNext` | impl/parser.js:412 |

  ... 省略 ...

--cpu-prof-intervalオプションはサンプリング間隔を調整したい場合に利用できます (デフォルト値は 1000 です)

OpenTelemetry

DENO_AUDIT_PERMISSIONS環境変数にotelの指定がサポートされています (#32501)

DENO_AUDIT_PERMISSIONS=otelが指定されると、アプリケーションから要求されたパーミッションをローカルファイルへは書き込まず、代わりに Log としてOpenTelemetryバックエンドへ送信されます。

deno coverage

deno coverageコマンドで関数のカバレッジがサポートされています (#32507)

deno coverageが表示するテーブルにFunction %列が追加されています:

| File           | Branch % | Function % | Line % |
| -------------- | -------- | ---------- | ------ |
| permissions.ts |     94.3 |      100.0 |   97.0 |
| All files      |     94.3 |      100.0 |   97.0 |

また、HTMLレポートにも同様の出力が追加されています。

deno doc npm:<package>

deno docコマンドでnpmパッケージ (npm:<package>) がサポートされています (#32435)

該当パッケージが提供する型定義などを元にドキュメントを表示してくれるようです:

$ deno doc npm:lines-and-columns
Defined in file:///path/to/npm/registry.npmjs.org/lines-and-columns/2.0.4/build/index.d.ts:5:1

class LinesAndColumns

  constructor(string: string)
  locationForIndex(index: number): SourceLocation | null
  indexForLocation(location: SourceLocation): number | null

Defined in file:///path/to/npm/registry.npmjs.org/lines-and-columns/2.0.4/build/index.d.ts:1:1

interface SourceLocation

  line: number
  column: number

--env

.envにおいて環境変数の置き換えがサポートされています (#32495)

例えば、以下のような.envがあったとします:

KEY=foo
KEY2=${KEY}_bar

この.env--envによって読み込んだ場合、以下のように出力されます:

console.info(Deno.env.get("KEY"));  // => foo
console.info(Deno.env.get("KEY2")); // => foo_bar

Node.js 互換性の改善

node:fs

cp()の内部実装の多くがRustで書き直され、パフォーマンスと互換性が改善されています (#32580)

Linux環境においては3倍近くまでパフォーマンスが改善されるケースもあるようです。

node:http2

denoland/libnghttp2をベースにnode:http2が再実装されています (#32418)

この変更により、Node.jsにおけるnode:http2の134個のテストスイートのうち130個がパスされるまで互換性が改善されているようです。

node:crypto

下記 API が実装されています:

  • ECDH.convertKey() (#32532)
  • KeyObject#toCryptoKey()及びKeyObject.from() (#32523)
    • この改善に合わせてSubtleCrypto#exportKey()及びSubtleCrypto#importKey()で ChaCha20-Poly1305 がサポートされています
  • createCipheriv()/createDecipheriv()でのdes-ede3-cbcのサポート (#32519)
  • getCipherInfo() - nid及びblockSizeプロパティーが返却されるように改善 (#32522)

node:dns

下記の改善が実施されています (#32536)

  • setDefaultResultOrder()ipv6firstがサポートされています
  • lookup()orderオプションがサポートされています
  • カスタムサーバーが未設定の場合、Resolver#getServers()/etc/resolv.confを参照するように改善されています

node:process

nextTick()で登録したコールバックがNode.jsと同様のタイミングで実行されるように改善されています (#32466)

元々、nextTick()で登録したコールバックがPromise.then()で登録したコールバックよりも後に実行されてしまう問題があったようです。

node:readline

下記キーバインディングが実装されています (#32538)

  • Ctrl+- (Undo)
  • Ctrl+^ (Redo)
  • Ctrl+Y (Yank)
  • Meta+Y

node:worker_threads

resourceLimitsが実装されています (#32430)

node:v8

下記APIが実装されています (#32483)

  • getHeapStatistics()
  • getHeapCodeStatistics()
  • getHeapSnapshot()
  • writeHeapSnapshot() (利用にはwriteパーミッションが必要です)

node:dgram

Socket#[Symbol.asyncDispose]() 及び createSocket()ipv6Onlyオプションが実装されています (#32520)

Node-API

下記APIが実装されています:

  • node_api_create_property_key_latin1()及びnode_api_create_property_key_utf8() (#32559)
  • node_api_create_object_with_properties() (#31443)

.npmrc

emailによる認証がサポートされています (#32616)

peerDependencies

peerDependenciesによって相互に依存しあったnpmパッケージが複数存在している場合、インストールがハングしてしまうことがある問題への修正が実施されています (#32609)

Web API

removeEventListener()

removeEventListener()に空オプションが指定された際に、うまくリスナーが削除出来ない問題が修正されています (#32508)

MikroORM 7

MikroORM v7.0.0がリリースされています。

Denoに関連する変更として、Node.jsの組み込みモジュールなどへの依存の削減により、Denoなどのランタイムへのサポートが強化されています。

MikroORMのCIにおいてDeno+node:sqlite及びDeno+mongodbの組み合わせでテストを実行する仕組みが導入されています:

また、JSRへのパッケージの公開も実施されています (@mikro-orm)