さようなら、Node.js
はじめに
こんにちは。JavaScriptの本を書いたりしているあんどうです。
JavaScript、流行ってますよね。より正確にはNode.js流行ってますよね。ぶっちゃけハンズオンなんとかもNode.jsの方がだいぶ・・・ゲフンゲフン。まぁハンズオンNode.jsはマジ名著なのでそのことは置いておくとして、そのNode.jsについて正直なところみなさんはどう思ってますでしょうか?
私はRails文化圏出身なので、開発に必要とわかりきっているツールを事前にわざわざあれやこれやと検証して設定してみたいなのが面倒くさくてしょうがないです。なんか思いついてキーボードに手を置いたらノータイムで機能の実装を開始したい。
しかもすぐ新しい同じようなツールが出てきて数年で主要ツール総取っ替え上等。ポジティブに捉えれば万物流転とか諸行無常とか人生のあれこれの現れかもしれないけど、正直回し車の中のハムスターでしかなく辛い。
そんなあなたと私にDenoですよ、というのが今回のお話です。
Deno
DenoはNode.js作者のRyanがNode.jsに関する後悔を晴らすために作成した、新しいJavaScript/TypeScript実行環境です。
JSConf EU 2019でDenoの計画を明らかにしたRyanの講演、「10 Things I Regret About Node.js」で挙げられたNode.jsに関する後悔は以下です。
- Promiseを活用しなかったこと
- JavaScriptにもともと備わっているセキュリティの観点を欠いていること
- ビルドシステムにGYPを使用したこと
- package.jsonによって「モジュール」がディレクトリ内のファイルと紐づくこと
- node_modulesのモジュール解決アルゴリズムが複雑すぎること
- require(“module”)で拡張子”.js”を省略できること
- index.jsは無駄
タイトルに10 Thingsとあるのに7つしかありませんが、間違いではありません。普通に7つしか挙げられてませんでした。Denoではこれらの後悔に対応するために次のような改善がなされています。
- 明示的に許可しないかぎり、デフォルトではJavaScriptのセキュリティサンドボックスを使用してネットワークにもファイルにもアクセス不可(2)
- APIでプロミスを活用(1)
- ESモジュールでURLを使用したモジュール指定を可能にすることで、モジュールシステムを単純化(4, 5, 6, 7)
が、今回お話したいのはそういう本質的なことではなく、もっと表面的なペラい話です。
Denoサブコマンド
突然ですがここでDenoのサブコマンドを確認してみましょう。
$ deno -h ... SUBCOMMANDS: bundle Bundle module and dependencies into single file cache Cache the dependencies compile UNSTABLE: Compile the script into a self contained executable completions Generate shell completions coverage Print coverage reports doc Show documentation for a module eval Eval script fmt Format source files help Prints this message or the help of the given subcommand(s) info Show info about cache or info related to source file install Install script as an executable lint Lint source files lsp Start the language server repl Read Eval Print Loop run Run a JavaScript or TypeScript program test Run tests types Print runtime TypeScript declarations upgrade Upgrade deno executable to given version
おわかりいただけるでしょうか?バンドラ、テストツール、カバレッジ計測ツール、フォーマッタ、リンターなどの開発ツールがはじめから用意されています。しかもrun
、test
、bundle
、fmt
などのサブコマンドには--watch
オプションまで用意されている気の利きよう。つまり、例えば
$ deno test --watch
としておけばファイルの変更を監視して、なにか変更があるたびにテストを実行してその結果を表示し続けてくれます。
その他、install
サブコマンドもなかなかいい感じで、Denoでコマンドラインツールを作成してinstall
すると、パスの通ったディレクトリに配置してコマンドとして利用できるようになります。また、実行環境込みでワンバイナリにまとめてくれるcompile
サブコマンドもなかなかの期待の新人ではないでしょうか。
TypeScript
さらに、Denoでは初めからTypeScriptが利用できます。npm install typescript
は不要ですし、REPLでもそのままTypeScriptの構文が利用できます。
$ deno Deno 1.14.2 exit using ctrl+d or close() > const greeting:() => string = () => "hello" undefined > greeting() "hello"
ただ、どうやらREPLでは構文を受け付けるだけで型チェックまではしてくれていなさそうなのですが・・・
> let msg:string; msg = 1 1
型エンスーな人はどんまい。
個人的にはREPLでササッと確認しているときに細かいことを指摘されてもうるさいだけなので、他所からコピペして来たコードが動くように構文チェックだけ行い、型チェックはせずに動作する現状の仕様は良いものだと思います。
まとめ
ということで、Denoを使えばサーバーサイドJavaScript/TypeScriptの開発(開始までの)体験が劇的に改善されることは間違いありません。今のところnpmに公開されている豊富なライブラリが利用できないことから(できるものもあります)、すぐにNode.jsから乗り換えることは現実的には難しいと思われますが、各種ツールがはじめから用意されているのはやはりどう考えても楽です。
早くDenoが天下を取ってNode.jsとさようならできる日を待ち望んでいます。
そんじゃーね。
その他の記事
Other Articles
関連職種
Recruit