deno v0.34.0の変更点まとめ

# 概要

https://github.com/denoland/deno/releases/tag/v0.34.0

denoのv0.34.0がリリースされたため、変更点をまとめます。

# Breaking Changes

## TypeScriptのstrictモードが有効化された

既存のコードについては、denoをv0.34.0にアップグレードすると、コンパイルが通らなくなる可能性があります。

strictモードについては[こちら](https://www.typescriptlang.org/docs/handbook/compiler-options.html)の`--strict`オプションの欄に記載されています。

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

# 新機能等

## (std/node/events) `on`関数がサポートされた

Node.jsのeventsモジュールのポリフィルに[on関数](https://nodejs.org/dist/latest-v13.x/docs/api/events.html#events_events_on_emitter_eventname)が実装されました。

```typescript
import { EventEmitter, on } from "https://deno.land/std@v0.34.0/node/events.ts";

const emitter = new EventEmitter();

let count = 0;
const timer = setInterval(() => {
  count += 1;
  if (count === 3) {
    clearInterval(timer);
  }
  emitter.emit('hoge', count);
}, 1000);

for await (const x of on(emitter, 'hoge')) {
  console.log(x);
  // [ 1 ]
  // [ 2 ]
  // [ 3 ]
}
```

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

## `Deno.makeTempFile`が実装された

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

一時ファイルを作成するための関数が実装されました。

オプションの形式は、`Deno.makeTempDir`と同様です。

使用する際は、`--allow-write`フラグを指定する必要があります。

```typescript
try {
  await Deno.makeTempFile({ prefix: "test_" });
} catch (error) {
  console.error(error);
}
```
## Compiler APIで`lib`オプションがサポートされた

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

Compiler APIから`lib.dom.d.ts`等のライブラリファイルが読み込めるようになりました。

v0.33.0までは、ライブラリファイルを読み込む手段がなかったため、DOM APIを利用したコードをコンパイルしようとすると、エラーが発生してしまいました。

```typescript:v0.33.0
const [diagnostics] = await Deno.compile(
  "mod.ts",
  {
    "mod.ts": "document.getElementById('hoge');"
  }
);
console.log(diagnostics);
// [ { message: "Cannot find name 'document'. Do you need to change your target library? Try changing the `lib` compi...", code: 2584, category: 3, startPosition: 0 } ]

```

v0.34.0以降では、`lib`オプションで読み込むライブラリを指定できます。

```typescript:v0.34.0
const [diagnostics] = await Deno.compile(
  "mod.ts",
  {
    "mod.ts": "document.getElementById('hoge');"
  },
  {
    lib: ["esnext", "dom"]
  }
);
```

## `--cert`オプションがサポートされた

`deno run`等を実行する際に`--cert`オプションでPEM形式の証明書を指定できます。

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

## (std/io/bufio.ts)`readDelim`/`readStringDelim`/`readLines`がexportされた

`readDelim`を使うと、指定したデリミタで入力を分割してくれます。

```typescript
import { readDelim } from "https://deno.land/std@v0.34.0/io/bufio.ts";

const encoder = new TextEncoder();
const decoder = new TextDecoder();
const buffer = new Deno.Buffer(encoder.encode("hoge,fuga,piyo"));
for await (const c of readDelim(buffer, encoder.encode(","))) {
  console.log(decoder.decode(c));
  // hoge
  // fuga
  // piyo
}
```

`readStringDelim`を使用すると、上記のコードをより簡潔に記述できます。

```typescript
import { readStringDelim } from "https://deno.land/std@v0.34.0/io/bufio.ts";

const encoder = new TextEncoder();
const buffer = new Deno.Buffer(encoder.encode("hoge,fuga,piyo"));
for await (const c of readStringDelim(buffer, ",")) {
  console.log(c);
}
```

`readLines`は`readStringDelim(reader, "\n")`の呼び出しと等価です。

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

## deno testでディレクトリを指定してテストを実行できるようになった

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

# その他の修正点

- `Deno.readDir`を実行した際に、ディレクトリ内に不正なUTF-8文字を含む名前のファイルが存在すると、クラッシュする問題が修正された。
  - https://github.com/denoland/deno/pull/4004
  - そのようなファイルはスキップするよう修正されています。
- dprintが0.6.0にアップグレードされた。
  - https://github.com/denoland/deno/pull/4026https://github.com/denoland/deno/pull/4026