Deno v1.19

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

--promptオプションの挙動がデフォルト化

例えば、以下のようなファイルがあったとします。

const content = await Deno.readTextFile("README.md");

このファイルを権限なしで実行しようとすると、下記のように権限を付与するか尋ねられるようになります。

$ deno run main.ts
⚠️  ️Deno requests read access to "README.md". Run again with --allow-read to bypass this prompt.
   Allow? [y/n (y = yes allow, n = no deny)]

Deno v1.18以前の挙動に戻したいときは--no-promptを指定する必要があります。

deno vendorコマンドの追加

サードパーティモジュールもバージョン管理に含めたいなどの要求を解決すべく導入されたコマンドです。

具体的な使い方としては、下記のようにエントリポイントを指定します。

$ deno vendor mod.ts

これにより、vendorディレクトリにmod.tsから依存されているサードパーティモジュールが保存されます。

また、vendorディレクトリに次のような内容でimport_map.jsonが作成されます。

{
  "imports": {
    "https://deno.land/": "./deno.land/",
    "https://unpkg.com/": "./unpkg.com/"
  },
  "scopes": {
    "./unpkg.com/": {
      "./unpkg.com/puppeteer@10.2.0/lib/esm/puppeteer/common/Debug.js": "./unpkg.com/puppeteer@10.2.0/lib/esm/puppeteer/common/Debug.js",
      "./unpkg.com/puppeteer@10.2.0/lib/esm/puppeteer/common/helper.js": "./unpkg.com/puppeteer@10.2.0/lib/esm/puppeteer/common/helper.js"
    }
  }
}

deno runを実行する際にこのImport Mapファイルを指定することで、vendorディレクトリに保存されたサードパーティモジュールを透過的に読み込むことができます。

$ deno run --import-map=vendor/import_map.json mod.ts

このvendorディレクトリをバージョン管理に含めれば、サードパーティモジュールのバージョンの固定ができます。

Deno.FileDeno.FsFileにリネーム

既存のDeno.FileはDeno v2.0で削除される予定のため、今後はDeno.FsFileの使用が推奨されます。

deno compileの安定性が向上

deno compileコマンドは実行可能ファイルを作成する際に、事前にJavaScriptコードをバンドルします。

このバンドル処理でeszipが使われるようになりました。(元々はswcが使われていました)

この影響により、安定性の向上などが期待されます。

Deno.File(Deno.FsFile)及びDeno.ConnでWeb Streams APIがサポート

例えば、Deno.FsFilereadableプロパティからReadableStreamにアクセスできます。

const file = await Deno.open("README.md");
const decoder = new TextDecoder();
for await (const x of file.readable) {
  console.log(decoder.decode(x));
}

WritableStreamにアクセスしたいときはwritableプロパティを参照します。

const res = await fetch("https://avatars.githubusercontent.com/u/35212662?v=4");
const file = await Deno.create("avator.png");
await res.body!.pipeTo(file.writable);

他にも、DenoネームスペースやDeno.Processstdinプロパティにreadableが、stdoutstderrにもwritableプロパティが追加されています。

Deno.ConnsetNoDelay()setKeepAlive()が追加

Deno.Connに下記メソッドが追加され、TCP接続に関する挙動をより詳細に制御できるようになりました。

conn.setNoDelay(); // Nagleアルゴリズムを無効化
conn.setKeepAlive(); // TCPキープアライブを有効化

これらのAPIの利用には--unstableが必要です

Deno.serveHTTPでUnixドメインソケットがサポート

import { serveListener } from "https://deno.land/std@0.126.0/http/mod.ts";

const listener = Deno.listen({ transport: "unix", path: "./http.sock" });
serveListener(listener, () => new Response("hello"));

利用するには--unstableが必要です。

CompressionStreamDecompressionStreamがサポート

CompressionStreamDecompressionStream がサポートされました。

これにより、Denoの本体でgzipなどを使用した圧縮や伸長などがサポートされます。

const res = await fetch("https://github.com/x-motemen/ghq/archive/refs/tags/v1.2.1.tar.gz");
const file = await Deno.create("ghq.tar");
await res.body!
  .pipeThrough(new DecompressionStream("gzip"))
  .pipeTo(file.writable);

また、現在brotliのサポートも検討中とのことです。

シグナルリスナAPIが安定化

Deno v1.17で実装されたシグナルリスナAPIが安定化されました。

今後は--unstableなしで利用できます。

const signalListener = () => {
  // SIGTERMのハンドリング...
};

// SIGTERMのリスナを登録
Deno.addSignalListener("SIGTERM", signalListener);

// SIGTERMのリスナを削除
Deno.removeSignalListener("SIGTERM", signalListener);

テスト関連の改善

deno coverageコマンドで--outputオプションがサポートされました。

このオプションではカバレッジレポートの出力先ファイルを指定できます。

また、Test Sanitizersのエラー表示が改善され、どこで問題が発生しているか特定しやすくなりました。

ウォッチャ(--watch)の改善

--no-clear-screenでスクリーンのクリアを無効化できるようになりました


deno_std v0.126.0

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

std/collections/group_byの改善やstd/nodeの互換性の向上などが実施されています。

collections/group_by

groupBy関数の型安全性が向上されました。

具体的には、関数のシグネチャが

export function groupBy<T>(
  array: readonly T[],
  selector: (el: T) => string,
): Record<string, T[]>;

から

export function groupBy<T, K extends string>(
  array: readonly T[],
  selector: (el: T) => K,
): Partial<Record<K, T[]>>;

に変更されています。

node

  • tls.connect()が実装されました。
  • fs.createWriteStream()の互換性が向上 (fs.closeオプションやhighWaterMarkオプションのサポートなど)
  • fs.write()の互換性が向上 (Uint8Arrayの取り扱いの向上など)
  • Buffer.fromでのbase64デコードの互換性が向上
  • setIntervalなどの変数を宣言しようとすると、エラーが発生する問題が解消

https://github.com/denoland/deno_std/commit/7363da42a4c11361e73ebb06ed03476012ecf9b8

deno scriptコマンド

Deno本体でdeno scriptコマンドを追加するPRが作成されています。

feat: “deno script” subcommand (#13725)

利用するには、まずdeno.json(c)ファイルの"scripts"でスクリプトを定義しておきます。

{
  "scripts": {
    "start": "deno run --allow-net mod.ts"
  }
}

そして、deno scriptコマンドを利用することで"scripts"で定義したスクリプトを実行できます。

 $ deno script start

定義されているスクリプトを一覧表示したいときは、引数なしでdeno scriptを実行します。

$ deno script

また、--configオプションを指定することで、例えばpackage.jsonで定義されているスクリプトも実行できるようです。

$ deno script --config package.json build

https://github.com/denoland/deno/pull/13725

Denoでのnpm:スキームのサポート

Deno本体でnpm:スキームをサポートすることが提案されています。

Support npm URLs (#13703)

具体的には、下記のようにnpm:を付与することでnpmパッケージを直接importできるようにすることが狙いのようです。

import React from "npm:react@17";

より詳細については、上記issueを参照ください。


https://github.com/denoland/deno/issues/13703

aleph-canary

aleph-canaryというリポジトリが公開されています。

ije/aleph-canary - GitHub

気になる人はウォッチしておくとよいかもしれないです。

また、Aleph.jsは最近new-architectureというブランチでも活発に開発が行われていて、JSXマジックの削除などの大きな変更も行われているようです。


https://github.com/ije/aleph-canary

FreshでカスタムAppコンポーネントとエラーページがサポート

FreshでカスタムのAppコンポーネントを定義できるようになりました。

feat: _app (#87)

pages/_app.tsxpages/_app.tsなどのファイルでカスタムのAppコンポーネントを定義できます。

また、Appコンポーネントに渡されるpropsの内容は下記ページから参照できます。

また、カスタムエラーページのサポートも追加されています。

feat: support custom error pages (#86)

  • 404エラーはpages/_404.tsx
  • 500エラーはpages/_500.tsx

などのファイルを用意すると、そこでエラーがハンドリングされます。

コンポーネントに渡されるpropsの内容については下記ページから参照できます。