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ページ向け)