JavaScript実行環境「Deno」とは?特徴やNode.jsとの違いを解説

※ 2023年4月5日更新

普段のお仕事に役立つ普遍的なプログラミングTIPSや、業界で注目度が高い最新情報をお届けする「編集部ピックアップ」。
今回はJavaScript実行環境「Deno」をご紹介します。

はじめに

長らく、JavaScriptといえばブラウザ上で動作するプログラミング言語として知られてきました。その後、サーバー上で実行できるJavaScript環境である「Node.js」の登場により、
ブラウザ以外の様々な場面でJavaScriptが使用できるようになりました。

「Deno(ディノ)」は、そのNode.jsの開発者であるRyan Dahl氏が「新しいJavaScript実行環境」として開発したソフトウェアです。この記事では、そのDenoの特徴やNode.jsとの違いについて解説していきます。

Denoとは

Denoは、サーバーやPC上でJavaScriptをプログラムとして実行できる「JavaScript実行環境」です。

「The best developer experience(最高の開発者体験)」を謳っており、開発を進めるにあたり便利な機能が標準搭載されている点が最大の特徴です。

Denoは2018年に開催されたJavaScriptの国際カンファレンス「JSConf」で、「Node.jsに関する10の反省点」というタイトルで行われたRyan Dahl氏の講演の中で発表されました。
講演では、Node.jsの反省点として具体的には以下の点が挙げられました。

  • APIの設計において非同期処理に使うpromiseを使用しなかったこと
  • 古いGYPビルドシステムを採用したこと
  • パッケージ管理において設定ファイルのpackage.jsonとnode_modulesを採用したこと
  • モジュールのインポートで拡張子を除外したこと
  • index.jsによりモジュール依存関係の解決を採用したこと
  • JavaScriptのコアエンジンV8によるサンドボックス環境を破壊するような実装をしたこと

Denoはこれらを解消すべく開発されたJavaScript実行環境です。

Node.jsと比較したDenoのメリットとデメリット

Node.jsは、現在でも多くのWeb開発で採用されているJavaScript実行環境です。しかしながら、Node.jsは前述の通り動作するために多くの設定ファイルが必要であったり、依存関係のインストールに多大な時間がかかるというデメリットを持っていました。

Denoは、Node.jsの持つ煩わしさを解決すべく誕生しました。より簡単に構築できる実行環境を提供することで、開発者はプログラミングに集中できます。

とはいえ、同じ開発者が開発したソフトウェアとはいえ、互換性がないためNode.jsで開発していた過去の資産を活用できないという点はデメリットと言えるでしょう。

それを受けてか、2022年にはnpmのサポートを開始し、2023年2月24日にリリースされた「v1.31」ではNode.js互換機能がDeno本体に統合され、「package.json」のサポートが追加されました。

Denoの特徴

Denoは、次のような特徴を持っており、Node.jsと比べても強力な機能を備えています。

TypeScriptの標準サポート

Denoでは、JavaScriptを拡張したプログラミング言語であるTypeScriptを標準でサポートしています。特に設定ファイル等を用意しなくても実行時に自動的にJavaScriptにトランスパイルして実行できるため、開発時の効率が高いと言えるでしょう。

オールインワン開発環境

Denoでは、リンターやフォーマッターといった開発者向けの機能やビルド・自動テストといった機能を標準で搭載しています。設定不要で使えるため、初心者でも厳格なコード記述を実現できます。

容易な実行環境

Denoは「ゼロコンフィグ」を謳っており、細かい設定をせずにJavaScriptを実行できます。JavaScriptまたはTypeScriptのコードを記述するだけで、容易にWebサーバーを構築できます。
※ 現在では「package.json」の使用もサポートしています。

セキュアな実行環境

Denoは、デフォルトでセキュリティが高い状態を維持します。

通信やファイル操作など、セキュリティ上リスクが高いコードを実行する場合には起動時にオプションをつける必要があります。
※ 例:ネットワーク通信をしたい場合には「–allow-net」オプションをつける必要があります。

オプションをつけずに実行した場合、通信やファイルの入出力などに制限がかかります。
一見煩わしい機能にも見えますが、「予期しないコードがセキュリティホールを生む」という事態を防げる点は運用を加味した場合には非常に有用な仕様と言えるでしょう。

Denoのインストール

Denoは、コマンドラインから簡単にインストールできます。OSによって実行するコマンドが異なるため注意しましょう。

MacまたはLinuxの場合

MacまたはLinuxの場合、以下のコマンドを実行してインストールします。

curl -fsSL https://deno.land/x/install/install.sh | sh

パスを通す

実行すると、以下のようにインストールが完了しますが、パスを通すように指示されます。

% curl -fsSL https://deno.land/x/install/install.sh | sh
######################################################################## 100.0%
Archive:  /Users/user/.deno/bin/deno.zip
  inflating: /Users/user/.deno/bin/deno
Deno was installed successfully to /Users/user/.deno/bin/deno
Manually add the directory to your $HOME/.zshrc (or similar)
  export DENO_INSTALL="/Users/user/.deno"
  export PATH="$DENO_INSTALL/bin:$PATH"
Run '/Users/user/.deno/bin/deno --help' to get started

Stuck? Join our Discord https://discord.gg/deno

この指示に従ってパスを通します。

export DENO_INSTALL="/Users/<ユーザー名>/.deno"
export PATH="$DENO_INSTALL/bin:$PATH"

このコマンドは、実行ユーザーに応じて変更されますので、ターミナルに表示されているコマンドをコピーして実行すると良いでしょう。

Windowsの場合

Windowsを使用している場合、以下のコマンドを実行するだけでインストールが完了します。

irm https://deno.land/install.ps1 | iex

Denoの実行

インストールが完了したら、実行できるかを確認してみましょう。

ターミナルからdeno --versionのコマンドを実行してバージョン情報が表示されれば準備は完了です。

% deno --version
deno 1.30.3 (release, x86_64-apple-darwin)
v8 10.9.194.5
typescript 4.9.4

DenoでTypeScriptの実行

まずはDenoで簡単なTypeScriptファイルを実行してみます。以下の内容で「hello-world.ts」を作成します。

console.log('Hello, Deno World!')

ターミナルから以下のコマンドを実行すると、TypeScriptファイルに記載した「Hello, Deno World!」の文字列が表示されます。

% deno run hello-world.ts
Hello, Deno World!

Denoを使用したWebアプリの作成

次に、Denoを使ったWebアプリケーションの構築を実施してみましょう。

import { serve } from 'https://deno.land/std@0.177.0/http/server.ts';

// ブラウザからアクセスするためのポート
const port = 8080;

// レスポンスを制御
const handler = (request: Request): Response => {
  const body = "Hello, Deno World!";
  return new Response(body, { status: 200 });
};

// サーバーを開始
await serve(handler, { port });

ファイルを用意したら、以下のコマンドを実行します。

Webサーバーとして起動する場合には、ネットワークを許可するために「–allow-net」オプションを指定することを忘れないようにしましょう。

deno run --allow-net server.ts

起動したら、「http://localhost:8080」にアクセスします。

DenoでWebアプリの実行

これで、Denoを使ったWebサーバーが起動できました。

DenoでHTMLの表示

さいごに、外部のHTMLファイルを読み込んで表示する方法を紹介します。まずは、表示するHTMLを用意しましょう。

<!DOCTYPE html>
<html lang="ja">
  <head>
    <title>Hello, Deno World with HTML</title>
  </head>
  <body>
    <p>Hello, <b>Deno</b> World!</p>
  </body>
</html>

このHTMLファイルを返却するTypeScriptを作成します。

import { serve } from 'https://deno.land/std@0.177.0/http/server.ts';

// ブラウザからアクセスするためのポート
const port = 8080;

// レスポンスを制御
const handler = (request: Request): Response => {
  // HTMLファイルを読み込み
  const body = Deno.readFileSync('index.html');
  return new Response(body, { status: 200 });
};

// サーバーを開始
await serve(handler, { port });

先ほどと同様に実行しますが、HTMLファイルの読み込みをするため--allow-readも追加することに注意しましょう。

deno run --allow-net --allow-read html-server.ts

起動したら、「http://localhost:8080」にアクセスします。

DenoでHTMLの表示

HTMLが正しく表示されていることが確認できました。

さいごに

今回の記事では、JavaScript実行環境であるDenoの概要やNode.jsとの違い、環境構築方法について紹介しました。

グレープシティでは様々なWebアプリケーションフレームワークと一緒に使えるJavaScriptライブラリを提供しています。無償のトライアル版や、ブラウザ上で手軽に試せるデモアプリケーションも公開しているので、こちらも是非ご覧ください。

\  この記事をシェアする  /