ワークスペースのサポートについて

DenoにワークスペースをサポートするPRがマージされています。Deno v1.39でリリースされる可能性があるかもしれません。

feat(unstable): Workspaces support #20410

これはdeno.jsonで定義された各ワークスペースごとに独自のImport Mapsを持たせることができる機能のようです。

利用方法

⚠️この機能は今後使用方法が大きく変わる可能性があります。

以下の構成のプロジェクトがあったとします。

.
├── deno.json
├── main.ts
├── ws-a
│   ├── deno.json
│   └── mod.ts
└── ws-b
    ├── deno.json
    └── mod.ts

ワークスペースを利用する際は、ルートディレクトリのdeno.jsonでワークスペースとして扱うディレクトリを指定します。

{
  "workspaces": ["ws-a", "ws-b"],
  "imports": {
    "$std/": "https://deno.land/std@0.206.0"
  }
}

これにより、ws-aws-bという2つのワークスペースが認識されます。

ws-a/deno.jsonは以下のように定義します。ここではルートディレクトリとは異なるバージョンのdeno_stdを読み込むよう指定しています。

{
  "name": "ws-a",
  "version": "0.0.1",
  "imports": {
    "$std/": "https://deno.land/std@0.207.0/"
  }
}

ws-a/mod.tsは以下のように書かれていたとします。

export { VERSION } from "$std/version.ts";

ws-b/deno.jsonは以下のように定義します。

{
  "name": "ws-b",
  "version": "0.0.1",
  "imports": {
    "chalk": "npm:chalk@5.3.0"
  }
}

ws-b/mod.tsは以下のように書かれていたとします。

export { VERSION } from "$std/version.ts";
export { default as chalk } from "chalk";

ルートディレクトリのmain.tsは以下のように書かれていたとします。

import { VERSION } from "$std/version.ts";
import { VERSION as VERSION_FROM_A } from "./ws-a/mod.ts";
import { VERSION as VERSION_FROM_B, chalk } from "./ws-b/mod.ts";
console.info(chalk.bold(VERSION));
console.info(VERSION_FROM_A);
console.info(VERSION_FROM_B);

この状態でルートディレクトリのmain.tsを実行してみます。この際に--unstable-workspacesを指定すると、ワークスペースのサポートが有効化されます。

$ deno run --unstable-workspaces main.ts
0.206.0 # ルートディレクトリではdeno_std@0.206.0が読み込まれます
0.207.0 # ws-aではdeno_std@0.207.0が読み込まれます
0.206.0 # ws-bではdeno_std@0.206.0が読み込まれます

Deno v1.38.2

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

AbortSignal.anyが実装

const signal1 = AbortSignal.timeout(1000);
const signal2 = new AbortController().signal;
const signal3 = AbortSignal.any([signal1, signal2]);
setTimeout(() => {
  console.info(signal3.reason); // => DOMException: Signal timed out.
}, 2000);

deno lsp: vscode-denoでDenoのアップデートがサポート

Denoの最新バージョンが見つかった際に、vscode-denoからプロンプトが表示されます。

deno upgrade同様、DENO_NO_UPDATE_CHECKが設定されていればスキップされます。

Node.js互換性の改善

  • node:perf_hooks: performance.getEntriesByName()/performance.getEntriesByType()が追加されました。
  • node:process: process.geteuid()が実装されました。(Windowsでは未定義(undefined)になります)
  • BYONM: node_modules内のCommonJS形式のエントリポイントを提供するパッケージが動作しない問題が修正されました。

その他

  • TextDecoderStreamで発生するリソースリークが修正されました。
  • --strace-opsオプションが追加されました。実行されたopを追跡できます。
    $ deno run -A --strace-ops=fs main.js
    [     0.027] op_fs_read_file_text_async: Dispatched Async
    [     0.028] op_fs_read_file_text_async: CompletedAsync Async
    

deno_std v0.207.0

deno_std v0.207.0がリリースされています。

v1のリリースに向けて新しいロードマップ(Roadmap to v1, pt. 2 #3805)が公開されていて、それに向けた作業が進められているようです。

TypeScriptのenumが非推奨化

deno_stdTypeScriptのenumの使用が非推奨化されています。

  • std/fs/eol.ts: EOLが非推奨化されました。
    • 代わりにLF/CRLFが追加されているため、それらで代用できます。
  • std/http/status.ts: Statusが非推奨化されました。
    • 代わりにSTATUS_CODE/STATUS_TEXTが追加されているため、それらで代用できます。
    • isInformationalStatus()などの各種述語関数もStatusではなくnumberを受け取るように変更されています。

非推奨化されたモジュール/APIの削除

以下の非推奨化されたモジュール/APIが削除されました。

  • std/wasi
  • std/http/http_errors.ts
  • std/crypto/crypto.ts: crypto.subtle.timingSafeEqual
    • std/crypto/timing_safe_equal.tsは残っていて、そちらは引き続き利用できます。

既存モジュール/APIの非推奨化

以下のモジュール/APIが非推奨化されました。

  • std/http/server_sent_event.ts
  • std/bytes/concat.ts: スプレッド形式のconcat()

std/flagsstd/cli/parse_args.tsへ移動

std/flagsstd/cli/parse_args.tsへ移動されました。

今後、CLIに関するAPIはこのstd/cliに追加されていく想定のようです。

std/data_structuresが追加

元々std/collections/unstable_*に配置されていたファイルがstd/data_structuresに移動されています。

  • collections/unstable_binary_heap.tsdata_structures/binary_heap.ts
  • collections/unstable_binary_search_tree.tsdata_structures/binary_search_tree.ts
  • collections/unstable_comparators.tsdata_structures/comparators.ts

この変更に合わせて、std/collectionsbinary_heap.ts/binary_search_tree.ts/red_black_tree.tsが非推奨化されています。

Deno Subhosting

Deno SubhostingというDenoの公式サービスが公開されました。

Deno SubhostingはSaaS提供者向けのサービスのようで、主にユーザーから提供されたカスタムコードを実行するための仕組みをサービスに実装するために利用されることが想定されているようです。現時点では、Netlify Edge Functionsなどの基盤として利用されているようです。