DenoとNode.jsの大きな違い
DenoとNode.jsは両方ともV8をバックエンドにしたサーバーサイドJavaScriptランタイムだが、そこには大きな違いが存在するkeroxp.icon それをDeno側から説明する
DenoではTypeScriptが実行できる
Node.jsではTypeScriptを実行できない。nodeコマンドにtsファイルを渡してもエラーになってしまう
Node.jsでtsを使うにはtscでコンパイルしてから実行するか、ts-nodeを使う必要がある
Denoではtsもjsも実行ができる。tsは同梱されたのtscがコンパイルして実行してくれる
Denoのコンパイラはファイルのハッシュ値によってjsのコンパイルキャッシュを保持してくれるので、コンパイルが速い
tsc自体にはキャッシュシステムは無いので毎回全部コンパイルしているせいで、プロジェクトが大きくなるにつれてコンパイル時間は長くなっていく
それに依存しているts-nodeも同様で、とにかく遅い
DenoではTypeScriptを書くための設定が必要ない。denoを入れて.tsファイルを書いたらすぐに実行できる
Denoは1つのファイルしかインストールしない
Node.jsをインストールするとどれくらいのファイルがインストールされるかご存知だろうか
答えは...5592個である(node-v13.11.0.pkg)
/usr/local/lib/include
/usr/local/lib/node_modules
らへんに沢山のファイルが入ってくる。標準ライブラリもまるごと入るのでファイルが非常に多い
Denoはdenoコマンドしかインストールしない
Denoを消すときはインストールされたdenoコマンドを消すだけでいい
Denoが内部的に使うファイルなどはすべてOSのキャッシュディレクトリに保存されるので、キャッシュを消せば消えるし、消えてもまたダウンロードするので問題ない
Denoの標準ライブラリはdenoコマンドにはバンドルされず、サードパーティと同じようにインストールすることになる
Denoにはnpmがない
Denoにはnpmがない。したがってnode_modulesもないし、Npm Incもない
Denoで外部モジュールを使う場合はimportにURLを渡すだけであり、それ以外の方法は無い
code:ts
ダウンロードは実行時に行われ、結果はキャッシュされる
なので実質的にdenoがnpmでありコードがpackage.jsonとも言える
Node.jsのnpmは、実質的にNpm Incが提供する単一のレジストリに依存しており、中央集権的なモデルになっている
npmパッケージをアップロードしたりインストールしたりするのにはnpmが必ず必要になる
Denoの場合はts/jsファイルをhttpでアクセスできるところに上げておくだけでよい
一番簡単なのはGithubである
Denoにはrequireがない
Denoにはrequireがない。ES2015で策定されたimportとexportしかない。
これはつまり独自のNode.js(CommonJS)のモジュール解決方法と決定的に異なるということである
Denoのモジュールは、有効なローカルの相対パスか、httpで始まるURLしか指定できない
requireができるような動的なモジュール解決方法をDenoは提供しない
これは賛否両論ある仕様だが、ESModuleの厳密なサブセットで、開発者やエディタにとっては明確な仕様だ
今はIDEのサポートがあまり充実していないが、各種IDEのベンダが本気を出したらむしろCommonJSよりも便利な仕組みになると考えている
Denoだけで開発を始められる
DenoはGoに影響を受けた設計になっており、標準に比較的色々な機能が組み込まれている
テストランナー
DenoはGoと似たテストランナーが内蔵されている(deno test)
*_test.tsで終わるファイルを置いておくと、deno testと打つとそのディレクトリのテストを実行してくれる
なおマッチャーなどは好きなものを使うことができるが、std(標準モジュールの)assetsを使うのが楽
バンドラー
Denoにはバンドラーが内蔵されている(deno bundle)
Denoで記述されたコードはバンドリングが可能である
Webpackのような狂気じみた設定の豊富さは無いが、ブラウザ用のコードを書くこともできる
フォーマッター
Denoにはフォーマッターが内蔵されている(deno fmt)
内部的にdprintというRust製のJS/TSフォーマッターが使われており、誇張なくprettierの7~10倍速い (dprint自体がDenoでメジャーデビューした感じがあるので色々と開発途上であることは内緒)
以前はprettierを使っていたので、完全互換ではないがprettierに似たフォーマッティングになる
Denoどうなのよ!と思っている人はまず単なるフォーマッターとしてインスコするのもアリ
ドキュメントツール
Denoにはドキュメント生成ツールが内蔵されている(deno doc)from v0.39.0
これを使うとそのファイルに書かれたJSDoc形式のドキュメント情報とTypeScriptの型情報を元にドキュメントデータを生成してくれる(json)
Webに公開されているコードは、公式サイトで動的に見ることができる
このように現代の複雑なJS開発環境に必須とも言える機能が内蔵されているのは非常に便利である
Fat Coreなのではないかという気もするが、そこらへんは一応最低限の機能に絞ろうというコアチームの意思がある