LoginSignup
1

Deno について学んでみた

Last updated at Posted at 2022-04-11

「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 のファルダの多さが問題になってしまった。

モジュール解決時の拡張子省略

  • 下記のように拡張子を省略できたがコードだけでは拡張子が分からないこと
ES Modules
    import default from './module'

CommonJS
    require("module")

index.js

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

app/
 ├ folder/
 │ └ index.js/
 └ main.js

main.js

import default from './folder'

フォルダを from で指定すると index.js が呼ばれる

後悔からの提案、目標

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

Deno とは

"改良版" Node.js

なぜ改良版なのか

今更 Node.js を変えることはできない。

変えてしまうと

Denoはどうなったのか

Promisesにこだわらなかったこと

非同期アクションはpromiseが返されるようになった。

セキュリティーについて

ファイルやネットワーク、環境へのアクセスは明示的なアクセス許可が必要になった
Deno は内部的に V8 エンジンを使うようになった。

実行時に権限オプションを付与することでアクセスが許可される。

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

ビルドシステムについて

GYP から GN に変更された。

package.json

使わなくなった

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

node_modules

外部モジュールを使うときはURLを指定し実行時に
ローカルのキャッシュフォルダにダウンロードされるようになった。

URL指定時にバージョンも指定できるので package.json が要らなくなった。
pnpmと同じ方式

モジュール解決時の拡張子省略

拡張子を省略できなくなった。

index.js

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

その他

  • TypeScript のサポート

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

  • トップレベル await

使えるようになったよぉ

// Node
const fetchData = async () => await fetch('someapi/data');
const data = fetchData();

// Deno
const data = await fetch('someapi/data');
  • ブラウザ互換性

    • fetch
    const resp = await fetch("https://example.com");
    const html = await resp.text();
    console.log(html);
    

    外部ライブラリが不要になった

    • Web Storage
    localStorage.setItem("key", "hoge");
    console.log(localStorage.getItem("key")); // hoge
    

    内部では SQLite を使っている

  • ビルドインツール

    • 最近の Node.js 開発の始め方
      TypeScript のインストール
      ESLint のインストール
      Prettier のインストール
      Jest のインストール
      テストカバレッジツールのインストール
      バンドラーのインストール

    最初からインストールしないといけないものが多い

    • Denoだと。
      コードのフォーマット => deno fmt
      コードのリント => deno lint
      ユニットテストの実行 => deno test
      テストカバレッジ => deno coverage
      スクリプトのバンドル => deno bundle
      TypeScript => 本体に内包

    Deno 本体さえあれば、開発に必要なツールが一通り揃っている!

デプロイ環境

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

フレームワークもあります

採用例

  • Deno の採用例 - GitHub
    次世代 Data Access API
  • Deno の採用例 - Slack

まとめ

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

おまけ

Node と Deno プロジェクト名似てませんか?

"node".split("").sort().join("")

気になった方は開発者ツールのコンソールを使って実行してみてね

参考リンク

YouTube : Node.jsに関する10の反省点 - Ryan Dahl - JSConf EU
OSDN Magazine : Node.jsオリジナル開発者、Node.jsでの経験を生かして安全なTypeScript処理系「Deno」を開発
fixel : JSランタイムエンジンDenoを触ってみる
deno : Deno Manual
Twitter : プロジェクト名?
kt3k.github : モダンな JavaScript/TypeScript 実行環境 Deno

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1