Denoばた会議 Monthly 第6回

Deno v1.19

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

main.ts

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コマンド

使い方

# サードパーティモジュール及びimport_map.jsonをvendorディレクトリへ書き込む
$ deno vendor mod.ts

# vendor/import_map.jsonによってサードパーティモジュールをvendorディレクトリから透過的に読み込めます
$ deno run --import-map=vendor/import_map.json 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.FileDeno.FsFileにリネーム

Web APIのFileとかぶって混乱を生むことがあったため

Deno.Fileはv2.0で削除予定のようなので、今のうちにDeno.FsFileに移行しておくことを推奨します。

Deno.FsFile(Deno.File)やDeno.ConnなどでWeb Streams APIがサポート

例) Deno.FsFile.readableReadableStreamへアクセスできます。

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

例) Deno.FsFile.writableWritableStreamへアクセスできます。

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.ConnsetNoDelay()setKeepAlive()がサポート

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

deno compileの安定性の向上

deno compileコマンドの内部では、元々swcを使用してコードがバンドルされていました。

Deno v1.19からはswcの代わりにeszipが使われるようになりました

これにより安定性の向上などが見込まれます。(スタックトレース、import.meta.urlなど)

(deno bundleコマンドでは引き続きswcが使われてます)

CompressionStreamDecompressionStreamがサポート

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);

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

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

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

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

その他の変更点

  • Deno.serveHttpでUnixドメインソケットがサポート
  • ウォッチャ(--watch)で--no-clear-screenがサポート
  • console.log()などでの循環参照の表示が改善
  • Test Sanitizersのエラー表示が改善

Deno本体でN-APIの実装が開始

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

これが実現されれば、Node.js向けにN-APIを使って書かれたネイティブモジュールが動くようになりそうです。

deno_std/dotenv

https://github.com/denoland/deno_std/pull/1877

まだマージされていませんが、deno_stdにdotenvモジュールを追加するPRが作成されています。

deployctl v1

公式のGitHubアクションがサポートされました。

      - name: Deploy to Deno Deploy
        uses: denoland/deployctl@main
        with:
          project: "nuxt3-example"
          root: ".output"
          entrypoint: "server/index.mjs"

aleph-canary

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

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

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

I’m porting tsc to Go

https://kdy1.dev/posts/2022/1/tsc-go

SWCの作者であるkdy1氏がtscをGoでポートしているという話

将来的にはDenoでも採用されるという可能性もあるかもしれません。