Denoことはじめ

なんかそろそろDenoのv1がでるらしい

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Deno 1.0 will be released May 13, 2020. We have achieved all of the major features and will be polishing and correcting APIs until then. Please open an issue now if there is an API that needs to be corrected.<a href="https://t.co/KXw3V4pvVF">https://t.co/KXw3V4pvVF</a></p>&mdash; Deno (@deno_land) <a href="https://twitter.com/deno_land/status/1244707313006624772?ref_src=twsrc%5Etfw">March 30, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ので、ちょっと試してみた。

# セットアップ
Homebrew使います

```bash
$ brew install deno
```

## ためす
おおーーー

```bash
$ deno https://deno.land/std/examples/welcome.ts
Download https://deno.land/std/examples/welcome.ts
Compile https://deno.land/std/examples/welcome.ts
Welcome to Deno 🦕
```

# 外部モジュール
一覧は[ここ](https://deno.land/x/)でいいのかな？

現時点で162しかラインナップされてないけど、後述の理由でより多くの外部モジュールが使えそうな。

## import
さっそく「後述の理由」。importのシンタックスが。。きもい！！

```typescript
import ky from 'https://unpkg.com/ky/index.js'
```

URLからimportする。。新しい。。(僕にとっては)

## 動作確認
探してみたら[jsonbox.io](https://jsonbox.io/)というAPIリクエストのモックに便利気なモノがあったので使ってみる。
適当なディレクトリに`index.ts`を作って。。

```typescript:index.ts
import ky from 'https://unpkg.com/ky/index.js'

async function main() {
  console.log("Hello, world!")

  const postRes = await ky.post('https://jsonbox.io/box_23b114bdda088dabdb93', {
    json: {
      name: 'Ishidall', job: 'engineer'
    }
  })

  console.log(postRes)

  const getRes = await ky.get('https://jsonbox.io/box_23b114bdda088dabdb93').json()

  console.log(getRes)
}

main()
```

```bash
$ deno --allow-net index.ts
Compile file:///Users/piyo/workspace/personal/deno-sample/index.ts
Download https://unpkg.com/ky/index.js
Download https://unpkg.com/ky@0.19.0/index.js
Hello, world!
Response { url, status, statusText, type_, trailer, headers, body, type, redirected }
[ { _id: "5e834309c9bdb40017341cf7", name: "Ishidall", job: "engineer", _createdOn: "2020-03-31T13:18:01.139Z" } ]
```

動的にパッケージダウンロードしてくれててすぎょい。。。。

ちなみに--allow-netがないと下記のようなエラーが。

```bash
$ deno index.ts
error: Uncaught PermissionDenied: network access to "https://jsonbox.io/box_23b114bdda088dabdb93", run again with the --allow-net flag
► $deno$/ops/dispatch_json.ts:44:11
    at PermissionDenied ($deno$/errors.ts:81:5)
    at unwrapResponse ($deno$/ops/dispatch_json.ts:44:11)
    at sendAsync ($deno$/ops/dispatch_json.ts:99:10)
```

デフォルトだと通信もできないのね。

## .d.tsファイル読み込めないの？
[このへん](https://deno.land/std/manual.md#using-external-type-definitions)にそれらしきことが書いてあるが、少なくとも上記で使ってるkyで色々試してみたがエラーでうまく行かなかった。

やり方が悪いのか、そもそも今はできないのか。。

一応`// @deno-types="./foo.d.ts"`のシンタックスで書いてみたが、typeのconflictがたくさん起きてしまった。
これはtsconfig周りで解決できるのか？？？

# HTTPサーバ立ててみる
とりあえずコードこぴって動かしてみただけ
[ソース](https://github.com/denoland/deno_std/blob/master/http/README.md#example)

```typescript
import { serve } from "https://deno.land/std/http/server.ts"
const s = serve("0.0.0.0:8000")

async function main() {
  for await (const req of s) {
    req.respond({ body: new TextEncoder().encode("Hello World\n") })
  }
}

main()
```

<img width="776" alt="スクリーンショット 2020-04-01 0.18.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207329/748493f9-c656-e971-41ea-8d391af42aa3.png">

うごく😂

`for await`ってなんだ問題が自分の中であるけどとりあえず今日はここまでにしておきます。