Deno v1.25.1
Deno v1.25.1がリリースされました。
Node.js互換に関する変更点
依存関係の解析結果に関するキャッシュが存在する場合、
deno compileが失敗する問題が修正されています。npm:URLで読み込まれたパッケージ内で、globalとglobalThisが一致するように修正されました。- node-fetchなどの
global.Promiseを参照するパッケージが動かない問題があったようです。
- node-fetchなどの
semverの取り扱いに関するnpmとの互換性の向上
- 元々、Rustのsemver crateが使われていましたが、自前でパーサが実装されたようです。
*付きのConditional exportsがサポートされています。{ "exports": { ".": { "types": "./types/src/index.d.ts", "require": "./cjs/index.cjs", "import": "./esm/index.js" }, "./driver": { "types": "./types/src/driver/index.d.ts", "import": "./esm/driver/index.js" }, "./driver/*": { "types": "./types/src/driver/*.d.ts", "import": "./esm/driver/*.js" } } }package.jsonで"type": "module"が指定されたパッケージについては、"main"ではなく"module"で指定されたファイルが読み込まれるように修正されました。fs-extraなどのパッケージが読み込めない問題が修正されました。
- 例えば、
copyディレクトリとcopy/index.jsが両方存在するようなパッケージでエラーが発生していたようです。
- 例えば、
下記のように、Node.jsのグローバルAPIと同名の変数を定義しているコードの読み込みに失敗する問題が修正されました。
const process = require('process');
その他の変更点
Deno.serve()のportオプションに使用中のポートを指定すると、プロセスがパニックする問題が修正されました。deno checkコマンドに--remoteと--no-remoteが同時に与えられたときは、エラーが発生するように修正されました。Deno.readTextFile()などでv8の最大文字列長を超えるファイルを読もうとすると、プロセスがパニックする問題が修正されました。- サーバから送信されたもののまだ読み込まれていないメッセージが存在すると、
WebSocketStream.closeが永遠に解決しない問題が修正されました。 TextDecoderの最適化- deno-csvのベンチマークが1.4x程に高速化されているようです。
https://github.com/denoland/deno/releases/tag/v1.25.1
deno_std v0.154.0
deno_std v0.154.0がリリースされました。
頭字語に関する命名形式の変更 (破壊的変更)
deno_stdで提供されているAPIの頭字語に関する命名形式が以下のように変更されています。
CSVStream=>CsvStreamJSONParseStream=>JsonParseStreamTextProtoReader#readMIMEHeader=>TextProtoReader#readMimeHeader
古い形式の命名は非推奨化されています。
std/encoding/csv: ColumnOptionsが削除 (破壊的変更)
parse()のcolumnsオプションにArray<string>形式の値を渡すことで代替できるため、ColumnOptionsが削除されています。
import { parse } from "https://deno.land/std@0.154.0/encoding/csv.ts";
const records = parse(`1,foo\n2,bar`, { columns: ["id", "name"] });
console.log(records); // => [ { id: "1", name: "foo" }, { id: "2", name: "bar" } ]
std/encoding/base58
Base58のエンコーディング・デコーディング用のモジュールが追加されています。
import { encode } from "https://deno.land/std@0.154.0/encoding/base58.ts";
console.log(encode("foobar")); // => "t1Zv2yaZ"
std/encoding/json(c)
JSONValue型の型定義が改善されています。
std/fs
各APIでURLオブジェクトが引数として渡せるようになりました。
import { move } from "https://deno.land/std@0.154.0/fs/move.ts";
await move(
new URL("./old.txt", import.meta.url),
new URL("./new.txt", import.meta.url),
);
また、copyやmoveなどの関数で、適切な箇所ではErrorの代わりにDeno.errors.AlreadyExistsが使われるように修正されました。
std/testing/asserts
assertFalseの型定義が改善されています。
また、assertNotInstanceOfの型定義がAssertion Functionsを使って改善されています。
std/node
node/http: Fastifyを動かすために、Server.setTimeout()のメソッドの定義が追加されています。(実装はまだのようです)node/fs:opendir()とopendirSync()が実装されています。node/fs:accessSync()で対象ファイルの所有者が自分自身であれば、そのファイルに設定された所有者向けのパーミションをチェックするように修正されています。
https://github.com/denoland/deno_std/releases/tag/0.154.0
Node.js互換モード(--compat)の削除について
Deno v1.25.0でnpmパッケージのサポートが入ったためか、Node.js互換モード(--compat)を削除するPRが作成されています。
このPRはすでにマージされており、次のv1.26あたりでリリースされる可能性がありそうです。
https://github.com/denoland/deno/pull/15678
Denoへの--no-npmオプションの追加について
現在、Denoに--no-npmオプションを追加するPRが作成されています。
このオプションを指定することにより、npm:形式でのimportを無効化できるようにすることが想定されているようです。
$ deno run --no-npm main.mjs
このPRはv1.26のマイルストーンに含まれており、次のマイナーリリースで追加される可能性がありそうです。
https://github.com/denoland/deno/pull/15673
Deno.escapeHtml
ReactコンポーネントをSSRした場合などに生成される巨大なHTMLなどを高速にエスケープすることを目的に、Deno.escapeHtml()というAPIの追加が検討されているようです。
Deno.escapeHtml("<div>あいうえお</div>");
まだリリースされるかは不明なものの、すでにPRが作成されています。
https://github.com/denoland/deno/pull/15761
deno-redis v0.27.0
deno-redis v0.27.0がリリースされています。
Redisから返却されたnull値を表現するBulkNil型がundefinedからnullへ変更されています。(破壊的変更)
const value = await redis.get("no-such-key");
assert(value === null); // => v0.26までだと`false`
同様に、RedisのNull Arrayが空の配列([])ではなくnullとして返却されるように変更されています。(破壊的変更)
const result = await redis.blpop(1, "no-such-list");
assert(result === null); // v0.26までだと`false`