Deno v1.4.0で実装された新機能の紹介

## はじめに

[Deno@v1.4.0](https://github.com/denoland/deno/releases/tag/v1.4.0)がリリースされました。
このリリースには多くの新機能が含まれています。
この記事ではそれらの新機能について紹介します。

## まとめ

- テストカバレッジの出力がサポートされた
- `deno run`コマンドで`--watch`フラグがサポートされた
- WebSocket APIが実装された
- `--unstable`フラグを付与すると、`isolatedModules`及び`importsNotUsedAsValues: error`オプションが有効化されるようになった
- `deno install`コマンドでインストールしたスクリプトがバンドルされるようになった
- `deno fmt`及び`deno lint`がチェックしたファイル数を表示するようになった
- `console.log`でCSSによるスタイリングがサポートされた

## テストカバレッジの出力がサポートされた

`deno test`コマンドにテストカバレッジのサポートが追加されました。
`deno test`コマンドを実行する際に、`--coverage`及び`--unstable`オプションを付与することで、テストカバレッジが出力されます。

```shell
$ deno test -A --coverage --unstable
Debugger listening on ws://127.0.0.1:9229/ws/d0d8502d-422f-4257-aa2a-db380af200e6
running 9 tests
test Application#evaluate ... ok (94ms)
test Application#exposeFunction ... ok (116ms)
test Application#onExit ... ok (78ms)
test Application#serveFolder ... ok (173ms)
test Application#serveFolder with prefix ... ok (199ms)
test custom executablePath ... ok (4ms)
test Chrome#evaluate ... ok (112ms)
test Chrome#load ... ok (119ms)
test Chrome#bind ... ok (106ms)

test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out (1002ms)

test coverage:
file:///home/uki00a/ghq/github.com/uki00a/carol/deps.ts 100.000%
file:///home/uki00a/ghq/github.com/uki00a/carol/test_util.ts 82.609%
file:///home/uki00a/ghq/github.com/uki00a/carol/mod.ts 96.429%
file:///home/uki00a/ghq/github.com/uki00a/carol/chrome.ts 90.769%
file:///home/uki00a/ghq/github.com/uki00a/carol/locate.ts 53.488%
file:///home/uki00a/ghq/github.com/uki00a/carol/application.ts 88.462%
file:///home/uki00a/ghq/github.com/uki00a/carol/transport.ts 77.500%
file:///home/uki00a/ghq/github.com/uki00a/carol/logger.ts 87.500%
```

現時点(v1.4.0)では上記のようなテキスト形式の出力のみがサポートされます。将来的には、`lcov`や`json`のようなフォーマットもサポートが検討されているようです。

## `deno run`コマンドで`--watch`フラグがサポートされた

次のように、`deno run`コマンドを実行する際に`--watch`及び`--unstable`オプションを付与することで、Denoが指定されたファイルを監視します。そのファイル及び依存ファイルに変更が発生する度に、ソースコードの再コンパイル及び再実行が行われます。

```shell
$ deno run --watch --unstable sample.ts
```

現時点では`deno run`コマンドのみが`--watch`オプションをサポートしていますが、将来的には`deno test`等にも追加される見込みのようです。

## WebSocket APIが実装された

Web標準に準拠したWebSocket APIが実装されました。使用する際は`--allow-net`フラグを指定する必要があります。

```typescript
const ws = new WebSocket("ws://localhost:8080");

ws.addEventListener("open", () => {
  ws.send("Hello");
});

ws.addEventListener("error", (e) => {
  console.error(e);
});

ws.addEventListener("message", (e) => {
  console.log(e);
  ws.close();
});

ws.addEventListener("close", () => {
  console.log("closed");
});
```

この変更に伴い、`std/ws`モジュールで提供されていたWebSocketクライアント([connectWebSocket関数](https://doc.deno.land/https/deno.land/std@0.68.0/ws/mod.ts#connectWebSocket))は削除されました。(WebSocketサーバについては、従来どおり`std/ws`モジュールで提供されます)

#### 参考

https://developer.mozilla.org/ja/docs/Web/API/WebSockets_API

## `--unstable`オプションを付与すると、`isolatedModules`及び`importsNotUsedAsValues: error`オプションが有効化されるようになった

現時点では`--unstable`オプションを指定したときのみ、これらのオプションが有効化されます。将来的には、`--unstable`オプションの有無に関わらず、デフォルトでこれらのオプションが有効化される見込みのようです。

この変更により、次のような影響があります。(`--unstable`オプションを指定したときのみ)

#### `interface`や`type`等をimportする際は`import type`を使う必要がある

```typescript
// NG🙅‍♂️
import { Application } from "./application.ts";

// OK🙆‍♂️
import type { Application } from "./application.ts";
```

#### `interface`や`type`等を再exportする際は`export type`を使う必要がある

```typescript
// NG🙅‍♂️
export { Hoge } from "./hoge.ts";

// OK🙆‍♂️
export type { Hoge } from "./hoge.ts";
```

#### 参考

* `isolatedModules`及び`importsNotUsedAsValues`オプションについて
  * [Isolated Modules](https://www.typescriptlang.org/ja/tsconfig#isolatedModules)
  * [Imports Not Used As Values](https://www.typescriptlang.org/ja/tsconfig#importsNotUsedAsValues)

## `deno install`コマンドでインストールしたスクリプトがバンドルされるようになった

**追記) いくつかのスクリプトのインストールで問題が発生したため、この変更は[v1.4.1](https://github.com/denoland/deno/releases/tag/v1.4.1)でrevertされました。現在、[swc](https://github.com/swc-project/swc)を使って`deno bundle`コマンドの再実装が行われており、それが完了次第、この変更は再度denoに取り込まれる見込みのようです([#7461](https://github.com/denoland/deno/pull/7461))**

`deno install`でインストールしたスクリプトが、その依存関係等も含め、単一のJSファイルにbundleされるようになりました。

これにより、ユーザがスクリプトの依存モジュールを再読込した際に、意図せずしてスクリプトが壊れてしまう問題を回避できるなどの利点があるようです。

## `deno fmt`及び`deno lint`がチェックしたファイル数を表示するようになった

`deno fmt`及び`deno lint`を実行した際に、チェックが行われたファイル数が表示されるようになりました。

これによって、ちゃんとチェックが行われたかどうか分かりやすくなっています。

```shell
$ deno fmt
Checked 13 files
# v1.4.0以前は、エラーがなければ何も表示されなかった
```

## `console.log`でCSSによるスタイリングがサポートされた

`%c`を使うことで、CSSによるスタイリングができるようになりました。

以下のコードを実行すると、`Deno`という文字の色が緑に、背景色が青で表示されます。

```typescript
console.log("Hello %cDeno", "color: green; background-color: blue");
```

![スクリーンショット 2020-09-21 19-17-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240412/5cb340ac-4078-b3ed-f9a1-dc25fd41b5c8.png)


現時点では、以下のスタイルがサポートされています。

* `color`
* `background-color`
* `font-weight`
* `font-style`
* `text-decoration-color`
* `text-decoration-line`

スタイリングを無効化したいときは、環境変数`NO_COLOR`に`true`を設定します。

## 参考

- [Deno 1.4 Release Notes](https://deno.land/posts/v1.4)