さて、こんな状況を想像してみてください。午後11時、冷たくも熱いコーヒーを手に持っていて(これが私の特技です)、私は JavaScriptランタイム の深い世界に没頭しています。そう、わかります、野生の金曜日の夜ですね?でも、ソフトウェアエンジニアとしては、「楽しみ」の定義が、猫が部屋の向こうから私を見つめながら、DenoとNode.jsを比較することにあることもあります。
この考えの少し背景をお話しすると、私は何年も Node.js を使い続けてきました。それは、まだ使える(品質が良い)状態なのに、なかなか手放せない古くなった服のようなものです。快適ですが、時には市場で流行っている新しいトレンドのものを手に入れたくなることもあります — 改訂版や新しいバリエーションのことです、わかりますよね。
本題に戻ると、登場するのが Deno、みんなが話題にしている現代のライバルです。何年もNode.jsに慣れている私にとって、Denoを深く探求し、その周りの盛り上がりに値するのか、同等かそれ以上のランタイムを持っているのかを自分自身で確認するのは自然な本能です。さあ、もう少し詳しく見てみましょうか?
最初の印象:これらの名前は誰が付けているのか?
2000年代後半、技術がまだ幼い頃、Node.jsは2009年から業界に存在していました。ChromeのV8エンジンを基盤に構築されたNode.jsは、スケーラブルなアプリを構築する手助けを着実に行ってきました。これは、非常に信頼性が高く、皆に好まれているJavaScriptのバージョンとして理解できます。
最新の情報として、Denoは2018年に発表されました。そして、はい、これは人気のNode.jsの元々の創造者であるライアン・ダールによっても開発されました。プロットのひねりですね?彼は戻ってきて、Nodeで彼が台無しにしたと思うすべてを指摘し、「コーヒーを持っていてくれ。私が修正する」と言いました。Denoは、安全性、シンプルさ、そして現代的な機能を核にして生まれました。そして、名前について気になる方へ…正直に言うと、私もわかりません。でもDenoはNodeのアナグラムですので、それはあります。
ラウンド1: セキュリティ
セキュリティについて話しましょう。なぜなら、私と同じような方なら、少なくとも一度は「おっと、APIキーを誤って公開してしまった」という瞬間を経験しているからです。(そのプロジェクトについてはもう話しません。)
Node.jsはセキュリティを開発者に委ねているため、.envファイルや権限についてよく知っておく必要があります — さもないと。Denoはどうでしょうか?それは、私たちの中にいるあの過剰に警戒している友人のようです。彼らはロックを何度も確認します。いずれにせよ、Denoはデフォルトで、ネットワーク、ファイルシステム、さらには環境変数へのアクセスを許可しない保護されたサンドボックスで動作します。明示的な許可がない限り。
以下はその例です:
Node.js
const fs = require('fs');
fs.writeFileSync('./hello.txt', 'Hello, World!');
console.log('File written successfully!');
Deno
const encoder = new TextEncoder();
await Deno.writeFile('hello.txt', encoder.encode('Hello, World!'));
console.log('File written successfully!');
しかし、許可なしでそのDenoコードを実行しようとすると、大きなエラーメッセージが表示されます:
PermissionDenied: Requires write access to "hello.txt".
そうです、Denoは手を抜きません。スクリプトを実行する際には、--allow-write
のようなフラグを明示的に渡す必要があります。これは少し面倒でしょうか?もちろん。しかし、偶然に混乱を引き起こすのを防いでくれますか?間違いなく。
ラウンド2:パフォーマンス
私はスピード狂ではありませんが、ランタイムに関してはパフォーマンスが重要です。アプリが「ピザを食べに行く人は?」と尋ねたとき、友人よりも早く応答してほしいですよね。
Node.jsとDenoはどちらもV8エンジンを使用しているため、高速です。しかし、DenoはRustで書かれており、パフォーマンスと信頼性の面でわずかな優位性を持っています。Rustのメモリ安全機能と同時実行モデルは、内部で強力な動作を実現しています。それを言うと、Node.jsはより長い間存在しており、そのパフォーマンス最適化は実戦でテストされています。
私はいくつかのベンチマークを実行しました。なぜなら、まあ、オタクだからです:
Node.jsでの基本的なHTTPサーバー:
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello from Node.js!');
});
server.listen(3000, () => console.log('Node server running on port 3000'));
Denoでの基本的なHTTPサーバー:
import { serve } from "https://deno.land/std/http/server.ts";
const server = serve({ port: 3000 });
console.log("Deno server running on port 3000");
for await (const req of server) {
req.respond({ body: "Hello from Deno!" });
}
結果は?Denoはリクエストの処理がわずかに速かったですが、ここではミリ秒の話をしています。ほとんどの実際のアプリケーションでは、その違いは劇的なものにはならないでしょう—次のTwitter(またはX?今はそう呼んでいるのですか?)を作ろうとしていない限り。
第3ラウンド:開発者体験
さて、この部分は私に大きな影響を与えました。Node.jsを使用しているなら、npmがあなたのプロジェクトの命脈であることを知っているでしょう。それはパッケージをインストールし、依存関係を管理し、時々node_modules
が2GBに成長したときに画面に向かって叫ぶ方法です。
Denoは「いや、ここではnpmは使わない」と言いました。その代わりに、分散型モジュールシステムを使用しています。モジュールをURL経由で直接インポートします。
import * as _ from "https://deno.land/x/lodash/mod.ts";
console.log(_.chunk([1, 2, 3, 4], 2));
最初は、「え、何?」と思ったけど、後でそれがどれだけクールか気づいた。もう膨大なnode_modules
フォルダを気にする必要はない!パッケージバージョンの不一致を気にする必要もない!すっきりとした、わかりやすいインポートだけ。でも、素直に言おう:npmの便利さと提供される多様なパッケージには慣れ親しんでいた。古い習慣はなかなか変わらない。
クイック比較
ここでは、DenoとNode.jsが構文やスタイルでどのように異なるかを示す簡単な比較を行います:
ファイルの読み込み
Node.js:
const fs = require('fs');
const data = fs.readFileSync('./file.txt', 'utf8');
console.log(data);
Deno:
const data = await Deno.readTextFile('./file.txt');
console.log(data);
HTTPリクエストの作成
Node.js(axiosを使用):
const axios = require('axios');
const response = await axios.get('https://api.example.com/data');
console.log(response.data);
Deno(組み込みFetch):
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
では、どちらを選ぶべきか?
もう少し分析する時間を取りましょう。つまり、Node.jsプロジェクトで首から上まで作業していると仮定して、優先事項を考えてみてください。すべてが順調に進んでいるのであれば、船を乗り換える必要はありません。Node.jsは今や成熟し、広大なエコシステムを持ち、すべての仕事をこなすことができます。ただし、新たに始めたい場合やセキュリティ重視のものを構築したい場合は、Denoを検討する価値があります。これは、Nodeのクールでより現代的な親戚であり、有名になる前のインディーズバンドを聴くタイプです。
私にとっては?おそらく、両方を試行し続けるでしょう。この時点でNode.jsは私にとっては馴染み深いものですが、Denoは新しいおもちゃのような魅力を持っています。さらに、より将来に向けたコードを保証する概念に引き込まれています。
すべてを頭の中から取り除いたので、今はモニターを移動させて掃除する必要があります。現在、約90%がエラーポップアップのスクリーンショットやランダムなコードスニペットで占められています。典型的なケースですね?
あなたの番です!
もうDenoを試しましたか、それともNode.jsを使い続けていますか?あなたの考えを下に書いてください — 私はいつでも良い技術的議論に参加する気満々です(ミームが関わっていればボーナスポイント!)。
Source:
https://dzone.com/articles/deno-vs-nodejs-the-showdown-nobody-asked-for