Deno触ってみた

# はじめに

Qiitaのトレンドをいつものように眺めていたらこちらの記事
[Denoの登場でNode.jsの時代は終わるのか？](https://qiita.com/so99ynoodles/items/c3ba2a528052827e3b3c)
を見つけて興味を持ってサンプルコードを動かしてみたログです。

Node.jsにいつか置き換わるかもしれないJS/TSランタイムだそうです。

[Deno公式](https://deno.land/)

ほんとうに入門の入門のところですが、チュートリアルで誰もがつまづきそうなポイントがあったので記事にしました。

【追記】
このような記事も見つけました。いろいろな違いがありますね。
[DenoとNode.jsの大きな違い](https://scrapbox.io/keroxp/Deno%E3%81%A8Node.js%E3%81%AE%E5%A4%A7%E3%81%8D%E3%81%AA%E9%81%95%E3%81%84)

# インストール
 
インストール方法は[公式サイト](https://deno.land/)参照

### Windows 10へのインストール手順
私はWindows10ユーザーなので、Windows10へのインストール方法を紹介します。
Windows10にDenoをインストールする場合、Chocolateyを使ってインストールをするので、まずはChocolateyを解説します。

#### ０．[Chocolatey](https://chocolatey.org/install#installing-chocolatey)をインストール

Chocolateyとは、はこちら参照ー＞[Chocolateyを使った環境構築の時のメモ](https://qiita.com/konta220/items/95b40b4647a737cb51aa)

（公式の[Installing Chocolatey](https://chocolatey.org/install#installing-chocolatey)を見ながら）


１．**PowerShell**を管理者権限で実行(CMDじゃなくて、PowerShell)
２．以下のコマンドをコピペして実行

```
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

>Run Get-ExecutionPolicy. If it returns Restricted, then run Set-ExecutionPolicy AllSigned or Set-ExecutionPolicy Bypass -Scope Process.

PowerShell上で `Get-ExecutionPolicy`を実行して `Restricted`と表示された場合は、上記コマンドの先頭を `Set-ExecutionPolicy AllSigned` にすればOKです。

```
> Get-ExecutionPolicy
Restricted
```

３．インストール完了まで少し待つ
`choco`コマンドが実行できればOKです。

```
> choco
Chocolatey v0.10.15
Please run 'choco -?' or 'choco <command> -?' for help menu.
```

#### Denoをインストール

続いてDenoをインストールします。
１．コマンドプロンプトを管理者権限で実行
２．以下のコマンドを実行

```
choco install deno
```

３．サンプルコードを動かして動作確認

```
>deno run https://deno.land/std/examples/welcome.ts
Welcome to Deno 🦕
```
コマンドプロンプト上で実行したときには"Deno"のあとに点が表示されるだけでした。
Qiitaにコピペして気づきましたが、これは恐竜の絵文字だったらしいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191958/0a32ecdb-512a-cbad-36fd-d25b75077d77.png)


# サンプルコードを動かす

[Deno公式](https://deno.land/)にあったOr a more complex one:のサンプルコードを動かしてみます

```sample.ts
import { serve } from "https://deno.land/std@0.50.0/http/server.ts";
const s = serve({ port: 8000 });
console.log("http://localhost:8000/");
for await (const req of s) {
  req.respond({ body: "Hello World\n" });
}
```

```
> deno sample.ts
Compile file:///C:/study/deno/sample.ts
Download https://deno.land/std@0.50.0/http/server.ts
Download https://deno.land/std@0.50.0/encoding/utf8.ts  
Download https://deno.land/std@0.50.0/io/bufio.ts       
Download https://deno.land/std@0.50.0/testing/asserts.ts
Download https://deno.land/std@0.50.0/async/mod.ts      
Download https://deno.land/std@0.50.0/http/_io.ts       
Download https://deno.land/std@0.50.0/io/util.ts
Download https://deno.land/std@0.50.0/path/mod.ts
Download https://deno.land/std@0.50.0/path/win32.ts
Download https://deno.land/std@0.50.0/path/posix.ts
Download https://deno.land/std@0.50.0/path/common.ts
Download https://deno.land/std@0.50.0/path/separator.ts
Download https://deno.land/std@0.50.0/path/interface.ts
Download https://deno.land/std@0.50.0/path/glob.ts
Download https://deno.land/std@0.50.0/path/_constants.ts
Download https://deno.land/std@0.50.0/path/_util.ts
Download https://deno.land/std@0.50.0/fmt/colors.ts
Download https://deno.land/std@0.50.0/testing/diff.ts
Download https://deno.land/std@0.50.0/path/_globrex.ts
Download https://deno.land/std@0.50.0/async/deferred.ts
Download https://deno.land/std@0.50.0/async/delay.ts
Download https://deno.land/std@0.50.0/async/mux_async_iterator.ts
Download https://deno.land/std@0.50.0/textproto/mod.ts
Download https://deno.land/std@0.50.0/http/http_status.ts
Download https://deno.land/std@0.50.0/bytes/mod.ts
error: Uncaught PermissionDenied: network access to "127.0.0.1:8000", run again with the --allow-net flag
    at unwrapResponse ($deno$/ops/dispatch_json.ts:43:11)
    at Object.sendSync ($deno$/ops/dispatch_json.ts:72:10)
    at Object.listen ($deno$/ops/net.ts:51:10)
    at listen ($deno$/net.ts:164:18)
    at serve (server.ts:261:20)
    at sample.ts:2:11
```

エラーが起きます。
`error: Uncaught PermissionDenied:` 

エラーメッセージにもある通り　`--allow-net` のフラグをつけないとネットワークアクセスができないです。

これは[Denoの登場でNode.jsの時代は終わるのか？](https://qiita.com/so99ynoodles/items/c3ba2a528052827e3b3c)のこちらの記載のとおりですね。

>Denoはdefaultで安全です（許可なしではファイル・ネットワーク・環境にアクセスできません）

記事を読んだときにはどうやって許可するんだろう？と思っていましたが、フラグを付けて実行をしないといけないということだったんですね。

フラグは `deno`のあとに付ければいいです。
sample.tsのあとに付けても `error: Uncaught PermissionDenied:` となります。

```
> deno run --allow-net sample.ts
http://localhost:8000/
```

`run`をつけなくても実行はできますが、公式のGetting Startedを見ると `run`付きで実行しているので、付けた方が良さそう。

```
deno --allow-net sample.ts
http://localhost:8000/
```

よく使いそうなフラグ

```
Network Access: --allow-net
Environment Variables: --allow-env
Read filesystem: --allow-read
Write filesystem: --allow-write
```

他にも `--allow-hrtime` みたいのがあるそう

参考:
[error: Uncaught PermissionDenied: network access to "127.0.0.1:8000", run again with the --allow-net flag](https://github.com/oakserver/oak/issues/51)

# おわりに
やっぱりNode.jsよりコードは書きやすそうな印象です。いつか案件で使ってみたい。

# 参考
- [Deno公式](https://deno.land/)
- [Deno公式ドキュメント](https://doc.deno.land/https/github.com/denoland/deno/releases/latest/download/lib.deno.d.ts)