Deno について学んでみた

# 「Node.js について後悔している10の事」
Node.js の作者 Ryan Dahl が Node.js の現状について、 
今の視点からみて後悔している事を発表
本人はバグに見えると言っている。
それを克服する Deno プロジェクトを提案
> 2018/06/06
> https://www.youtube.com/watch?v=M3BM9TB-8yA

# 後悔
- Promisesにこだわらなかったこと
- セキュリティーについて
- ビルドシステムについて
- package.json
- node_modules
- モジュール解決時の拡張子省略
- index.js

## Promisesにこだわらなかったこと
- 2009年に追加しながらも2010年2月に削除してしまった

## セキュリティーについて
- V8のセキュリティサンドボックス機能を有効活用できていないこと。
- Nodeプログラムを実行すると、あらゆる種類のシステムコールにアクセスできてしまう。
- ディスクのアクセスを許可した場合に悪用される可能性がある。

## ビルドシステムについて
- 恐らく最大の後悔だそう。
- Chromeが使っていたGYPを採用したが、
    その後ChromeはGYPからGNに変更してしまい取り残された。
    その後もGYPを使い続けた

## package.json
- ライセンスやリポジトリなど不要な情報を含む仕様になってしまった。
- ライブラリにリンクすることだけが目的だから必要ないべき。

## node_modules
- モジュール解決アルゴリズムが複雑になってしまった
- npm でモジュールをダウンロードするが 
    node_modules のファルダの多さが問題になってしまった。

## モジュール解決時の拡張子省略
- 下記のように拡張子を省略できたがコードだけでは拡張子が分からないこと

```ts=
ES Modules
    import default from './module'

CommonJS
    require("module")
```

## index.js
- ディレクトリにindex.jsを含めると検索されて可愛いだろうと思ったが無駄だった。
    それが単純に可愛いだけで不要な場合は実行しないことをおすすめします。

app/
　├ folder/
　│　└ index.js/
　└ main.js
```ts=
main.js

import default from './folder'
```
> フォルダを from で指定すると index.js が呼ばれる

# 後悔からの提案、目標
- セキュリティの強化
- ES Module だけを使う
- TypeScript ビルトイン
- 単体の実行ファイルで動く
- モダンな開発環境を使う
- 可能な限りブラウザ互換にする

# Deno とは

"改良版" Node.js

# なぜ改良版なのか
今更 Node.js を変えることはできない。
> 変えてしまうと

# Denoはどうなったのか
## Promisesにこだわらなかったこと
非同期アクションはpromiseが返されるようになった。

## セキュリティーについて
ファイルやネットワーク、環境へのアクセスは明示的なアクセス許可が必要になった
Deno は内部的に V8 エンジンを使うようになった。
> 実行時に権限オプションを付与することでアクセスが許可される。

７種類のパーミッションがあり、コマンドライン引数で渡す。
`--allow-read` ファイル読み取り
`--allow-write` ファイル書き込み
`--allow-net` ネットワーク
`--allow-env` 環境変数読み取り
`--allow-run` プロセス実行
`--allow-ffi` ネイティブ拡張の使用を許可
`--allow-hrtime` 高精度タイマーの使用を許可

![](https://i.imgur.com/OKaPSdW.png)

## ビルドシステムについて
GYP から GN に変更された。

## package.json
使わなくなった
> package.json でパッケージ管理やバージョン管理する必要が無くなった

## node_modules
外部モジュールを使うときはURLを指定し実行時に
ローカルのキャッシュフォルダにダウンロードされるようになった。
> URL指定時にバージョンも指定できるので package.json が要らなくなった。
> pnpmと同じ方式

## モジュール解決時の拡張子省略
拡張子を省略できなくなった。

## index.js
フォルダを指定してもindex.jsを読み込まなくなった。

## その他
- TypeScript のサポート
> Deno ではデフォルトで使用できるようになった。(ライブラリ追加が不要になった)
> ネットワーク越しの TypeScript も型補完が可能になった！

- トップレベル await
> 使えるようになったよぉ
```ts=
// Node
const fetchData = async () => await fetch('someapi/data');
const data = fetchData();

// Deno
const data = await fetch('someapi/data');
```

- [ブラウザ互換性](https://deno.com/blog/every-web-api-in-deno)
    - fetch
    ```ts=
    const resp = await fetch("https://example.com");
    const html = await resp.text();
    console.log(html);
    ```
    > 外部ライブラリが不要になった
    
    - Web Storage
    ```ts=
    localStorage.setItem("key", "hoge");
    console.log(localStorage.getItem("key")); // hoge
    ```
    > 内部では SQLite を使っている

- [ビルドインツール](https://deno-ja.vercel.app/manual@v1.5.1/tools)
    - 最近の Node.js 開発の始め方
    TypeScript のインストール
    ESLint のインストール
    Prettier のインストール
    Jest のインストール
    テストカバレッジツールのインストール
    バンドラーのインストール
    > 最初からインストールしないといけないものが多い

    - Denoだと。
    コードのフォーマット => deno fmt
    コードのリント => deno lint
    ユニットテストの実行 => deno test
    テストカバレッジ => deno coverage
    スクリプトのバンドル => deno bundle
    TypeScript => 本体に内包
    > Deno 本体さえあれば、開発に必要なツールが一通り揃っている!

## デプロイ環境
https://deno.com/deploy/

デプロイ環境は公式が用意してくれる！！

## フレームワークもあります
https://alephjs.org/

https://fresh.deno.dev/

# 採用例
- Deno の採用例 - [GitHub](https://next.github.com/projects/flat-data/)
次世代 Data Access API
- Deno の採用例 - [Slack](https://deno.com/blog/slack)

# まとめ
Deno は 改良版 Node.js を目指すプロジェクト

# おまけ
Node と Deno プロジェクト名似てませんか？

![](https://i.imgur.com/lFP36i1.png)
```
"node".split("").sort().join("")
```
> 気になった方は開発者ツールのコンソールを使って実行してみてね

# 参考リンク
[YouTube : Node.jsに関する10の反省点 - Ryan Dahl - JSConf EU](https://www.youtube.com/watch?v=M3BM9TB-8yA)
[OSDN Magazine : Node.jsオリジナル開発者、Node.jsでの経験を生かして安全なTypeScript処理系「Deno」を開発](https://mag.osdn.jp/18/06/11/191000)
[fixel : JSランタイムエンジンDenoを触ってみる](https://fixel.co.jp/blog/deno/)
[deno : Deno Manual](https://deno.land/manual)
[Twitter : プロジェクト名？](https://twitter.com/deno_land/status/1262517004159913985?s=20&t=jX4mlRRnxAlyWnFu6B5LKQ)
[kt3k.github : モダンな JavaScript/TypeScript 実行環境 Deno](https://kt3k.github.io/talk_devsumi_2022_deno/#1)