この記事はただの感想なので、暇な人だけ読んでください。
Denoを使い始めて半年以上経っているので、これから使い始める人向けにDenoを使ってみた感想を書いていきたいと思います。
Denoのいい所
URLを使ったimportは便利
Denoの特徴の一つが、URLを使ったブラウザ互換なimport文です。
// このコードを実行すると自動でlodashがインストールされる
import * as lodash from "https://deno.land/x/lodash@4.17.15-es/lodash.js"
一見するとアップデートのたびに手動で書き換える量が多く、面倒ではないかと思うのですが、自分の場合は下の画像のように、依存関係のアップデート作業をGitHub Actionsで自動化したことで便利になりました。
特に、モジュールの指定と実装が同じファイルに存在するので、アップデートした時に影響を受ける箇所が一目でわかるのが有難いです。
上の例だと、media_types
モジュールに依存しているのはserve.ts
だけなので、依存関係のアップデートでコードの書き換えが必要な場合はserve.ts
だけを見ればいいことが分かります。
「依存関係のバージョン指定箇所とソースコードの距離が近い」というのはコードを書く上ですごくメリットだと感じました。
※ちなみに、GitHub Actionsで自動アップデートをかける方法は@kawarimidollさんの記事やdeno-uddのGutHubリポジトリが参考になりました。また、自分が使っているworkflowのyamlファイルも参考になると思います。
また、例えばNode.jsではnode_modulesフォルダ内に全ての依存関係をダウンロードするため、semverを使ってライブラリのバージョンを「いい感じに」解決する必要がありました。しかし、Denoではそもそも複数のバージョンが依存関係に含まれていても特に問題ないため、semverを使う必要はありません。
これも、Denoの依存関係の解決方法を気に入っている理由の一つです。
DX(開発者体験)がよい
自分がこれまで使ってきた他の言語と比べると、Denoは明らかにDXがよいです。
- 環境構築が簡単
- リンター、フォーマッター、テスター、language serverが同梱されている
- 設定ファイル不要
- アップデートが簡単(
deno upgrade
コマンド)
設定ファイル不要なので、書いたコードがそのまま動いてくれるのが嬉しいポイントです。
自分は簡単な四則演算はブラウザコンソールでやってしまうのですが、「四則演算するのと同じくらいの手軽さでサーバーが建つ」というくらいの手軽さ(自分の感覚ですが)なので、書き捨てスクリプトからwebのバックエンドまで幅広く利用しています。
Denoのつらいところ
上ではDenoのいい所を紹介しましたが、つらいところもあります。
日本語情報が少ない
Denoは新しいランタイムなので、Node.jsや他の言語と比べると検索してもまだ情報がヒットしづらいです。
また、日本語版の公式サイトのバージョンが古くなってしまっていたり、標準ライブラリのドキュメントが英語版しかないため、最新情報を得るのが大変かもしれません。(もちろん、OSSなので文句を言う前に自分でcontributeすべきなのですが)
これとは直接関係はありませんが、language serverで日本語を使うと時々クラッシュする問題や、prompt関数が日本語入力に対応していない問題もあります。特に、prompt関数は標準入力の受け取りという便利な関数なので、早く修正されて欲しいです。
こうした、「日本語環境特有のつらさ」みたいなものを感じる時があります。
標準ライブラリがバージョン0
Denoの標準ライブラリはまだバージョン1に到達していないため、破壊的変更が入る可能性があります。
基本的にコードを書く上で標準ライブラリは必須なので、早くバージョン1になって安定してほしいです。
モジュールごとのパーミッション指定ができない
Denoはコマンドラインフラグで--allow-write
等のフラグを指定して、パーミッションを制御することができます。しかし、ここで指定した権限はプログラム全体に適用されるため、「このモジュールはread権限だけ」というような指定ができません。
どうやら技術的に不可能という事らしいですが、これ何とかならんのかなぁと思っています。
まとめ・雑感
- 結局従来の
require()
やexperimentalDecorators
を捨てるためには全体的にコードを書き換える必要があるので、それならNodeを捨ててみんなでDenoに移行してしまったほうが色々と楽な気がした - Node.jsでよくありがちだった「インストール時にbabelやtscでトランスパイル」「サーバーへのデプロイ時にトランスパイル」みたいなものをDeno界隈では嫌うイメージ。そういう変換が前提だったNode.jsライブラリはDenoで使うのが辛いかも?
色々書きましたが、総合的にはDenoは良いソフトウェアだと思うので、今後も使っていきたいです。