Deno v1.25.1

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

Node.js互換に関する変更点

  • 依存関係の解析結果に関するキャッシュが存在する場合、deno compileが失敗する問題が修正されています。

  • npm:URLで読み込まれたパッケージ内で、globalglobalThisが一致するように修正されました。

    • node-fetchなどのglobal.Promiseを参照するパッケージが動かない問題があったようです。
  • 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 => CsvStream
  • JSONParseStream => JsonParseStream
  • TextProtoReader#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),
);

また、copymoveなどの関数で、適切な箇所ではErrorの代わりにDeno.errors.AlreadyExistsが使われるように修正されました。

std/testing/asserts

assertFalseの型定義が改善されています。

また、assertNotInstanceOfの型定義がAssertion Functionsを使って改善されています。

std/node

  • node/http: Fastifyを動かすために、Server.setTimeout()のメソッドの定義が追加されています。(実装はまだのようです)
  • node/fsopendir()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が作成されています。

BREAKING(unstable): remove –compat mode (#15678)

このPRはすでにマージされており、次のv1.26あたりでリリースされる可能性がありそうです。


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

Denoへの--no-npmオプションの追加について

現在、Denoに--no-npmオプションを追加するPRが作成されています。

feat: add –no-npm flag to disable npm: imports (#15673)

このオプションを指定することにより、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が作成されています。

feat(runtime): Add Deno.escapeHtml (#15761)


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`

https://github.com/denodrivers/redis/releases/tag/v0.27.0