はじめに
DenoはNode.jsの生みの親Ryan Dahl氏が「より安全でモダンなJavaScript/TypeScriptランタイム」を目指して開発した新世代のプラットフォームです。Deno 2.0以降はNode.js互換性も大きく向上し、TypeScriptの標準サポートや高いセキュリティ、シンプルなツールチェーンなど、現代的な開発体験を提供します。本記事では、Denoの基礎から実践的なWebアプリ開発、テスト、デプロイまで、14章にわたり丁寧に解説します。各章には実際に動作するコードも掲載しているので、ぜひコピペして体験してください。
第1章:Denoとは何か
Denoは、V8エンジンとRustで構築されたJavaScript/TypeScriptランタイムです。Node.jsの課題を解決するために設計され、デフォルトでセキュアな実行環境、TypeScriptのネイティブサポート、URLによるモジュール管理、組み込みのツールチェーン(フォーマッターやテストランナーなど)を備えています。npmやpackage.jsonに依存せず、モダンな開発者体験を重視しています。
第2章:Denoのインストール
Denoのインストールは非常に簡単です。OSごとに以下のコマンドを実行してください。
# macOS/Linux
curl -fsSL https://deno.land/install.sh | sh
# Windows (PowerShell)
irm https://deno.land/install.ps1 | iex
# Homebrew
brew install deno
インストール後、deno --version
でバージョン情報が表示されれば準備完了です。
第3章:プロジェクトの初期化と設定
Denoプロジェクトはdeno.json
ファイルで設定を管理します。プロジェクトディレクトリを作成し、初期化コマンドを実行しましょう。
mkdir my-deno-app
cd my-deno-app
deno init
生成されたdeno.json
にはタスクやインポートマップなどを設定できます。
第4章:最初のDenoスクリプト
DenoはTypeScriptをそのまま実行できます。まずは「Hello, Deno!」を出力するスクリプトを作成しましょう。
// hello.ts
console.log("Hello, Deno!");
実行は以下のコマンドです。
deno run hello.ts
第5章:HTTPサーバーを作ってみよう
Denoの標準モジュールで簡単にWebサーバーを立てられます。最もシンプルなサーバー例です。
// server.ts
function handler(_req: Request): Response {
return new Response("Hello, World!");
}
Deno.serve(handler);
以下で起動します。
deno run --allow-net server.ts
第6章:ルーティング処理の追加
複数のパスに応じてレスポンスを切り替えるルーティング例です。
// router.ts
function handler(req: Request): Response {
const url = new URL(req.url);
if (url.pathname === "/") {
return new Response("トップページです");
} else if (url.pathname === "/about") {
return new Response("Denoについてのページ");
}
return new Response("Not Found", { status: 404 });
}
Deno.serve(handler);
第7章:非同期処理とAPIサーバー
Denoはasync/awaitを標準サポート。JSON APIサーバーの例です。
// api.ts
async function handler(_req: Request): Promise {
const data = { message: "Deno APIからこんにちは" };
return new Response(JSON.stringify(data), {
headers: { "Content-Type": "application/json" },
});
}
Deno.serve(handler);
第8章:ファイル操作とパーミッション
Denoはファイルアクセスに明示的な許可が必要です。ファイルの読み書き例です。
// file.ts
await Deno.writeTextFile("sample.txt", "Denoでファイル書き込み");
const text = await Deno.readTextFile("sample.txt");
console.log(text);
実行時に--allow-read --allow-write
フラグが必要です。
deno run --allow-read --allow-write file.ts
第9章:外部モジュールの利用
DenoはURLで外部モジュールを直接インポートします。例として日付操作ライブラリを使います。
// date.ts
import { format } from "https://deno.land/std@0.224.0/datetime/mod.ts";
const now = new Date();
console.log(format(now, "yyyy-MM-dd HH:mm:ss"));
第10章:テストの書き方
Denoはテストランナーを内蔵しています。テストファイル例です。
// sum.ts
export function sum(a: number, b: number): number {
return a + b;
}
// sum_test.ts
import { sum } from "./sum.ts";
import { assertEquals } from "jsr:@std/assert";
Deno.test("sum関数のテスト", () => {
assertEquals(sum(1, 2), 3);
});
テスト実行は
deno test
第11章:フォーマッターとリンター
Denoはコード整形・静的解析ツールも標準搭載です。
# コード整形
deno fmt
# 静的解析
deno lint
プロジェクト全体に適用できます。
第12章:環境変数とパーミッション管理
Denoで環境変数を扱うにはパーミッションが必要です。
// env.ts
const value = Deno.env.get("MY_ENV") ?? "未設定";
console.log(`MY_ENV: ${value}`);
実行時に--allow-env
フラグを付けます。
MY_ENV=hello deno run --allow-env env.ts
第13章:FreshによるモダンWebアプリ開発
Deno公式のWebフレームワーク「Fresh」を使うと、Next.jsのようなファイルベースルーティングやSSRが簡単にできます。
deno run -A -r https://fresh.deno.dev my-fresh-app
cd my-fresh-app
deno task start
routes/index.tsx
を編集してページをカスタマイズできます。
第14章:Deno Deployによるデプロイ
Deno Deployを使えば、作成したアプリをグローバルに公開できます。
- Deno Deployにアクセスし、アカウント作成。
- 新しいプロジェクトを作成し、GitHubリポジトリと連携。
- mainエントリポイントを指定し、デプロイ。
FreshやDenoサーバーアプリはそのままデプロイできます。
まとめ
Denoはシンプルかつ強力なモダンJavaScript/TypeScriptランタイムです。セキュリティ、開発体験、パフォーマンス、デプロイのしやすさなど、現代的な要件を満たす設計がなされています。本記事のサンプルを参考に、ぜひDenoの世界を体験し、次世代のWeb開発を始めてみてください。