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.FileがDeno.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.FsFileのreadableプロパティから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.Processのstdinプロパティにreadableが、stdoutとstderrにもwritableプロパティが追加されています。
Deno.ConnにsetNoDelay()と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が必要です。
CompressionStreamとDecompressionStreamがサポート
CompressionStreamとDecompressionStream がサポートされました。
これにより、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が作成されています。
利用するには、まず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:スキームをサポートすることが提案されています。
具体的には、下記のようにnpm:を付与することでnpmパッケージを直接importできるようにすることが狙いのようです。
import React from "npm:react@17";
より詳細については、上記issueを参照ください。
https://github.com/denoland/deno/issues/13703
aleph-canary
aleph-canaryというリポジトリが公開されています。
気になる人はウォッチしておくとよいかもしれないです。
また、Aleph.jsは最近new-architectureというブランチでも活発に開発が行われていて、JSXマジックの削除などの大きな変更も行われているようです。
https://github.com/ije/aleph-canary
FreshでカスタムAppコンポーネントとエラーページがサポート
FreshでカスタムのAppコンポーネントを定義できるようになりました。
pages/_app.tsxやpages/_app.tsなどのファイルでカスタムのAppコンポーネントを定義できます。
また、Appコンポーネントに渡されるpropsの内容は下記ページから参照できます。
また、カスタムエラーページのサポートも追加されています。
- 404エラーは
pages/_404.tsx - 500エラーは
pages/_500.tsx
などのファイルを用意すると、そこでエラーがハンドリングされます。
コンポーネントに渡されるpropsの内容については下記ページから参照できます。
- UnknownPageProps (404ページ向け)
- ErrorPageProps (500ページ向け)