DenoとNode.jsの大きな違い
Denoと
Node.jsは両方とも
V8をバックエンドにしたサーバーサイドJavaScriptランタイムだが、そこには大きな違いが存在する

それを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を渡すだけであり、それ以外の方法は無い
tsimport * as http from "https://deno.land/std/http/mod.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なのではないかという気もするが、そこらへんは一応最低限の機能に絞ろうというコアチームの意思がある