Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新(準備中)

May 18, 2025 - 日記

DenoでTypeScriptを手軽に実行しよう

Denoを使えばTypeScriptを簡単に実行することができます。 Denoでは、以下のようなTypeScriptスクリプトを直接実行できます。

例: 「Ethereum鍵ペアを生成するTypeScriptスクリプト」

#!/usr/bin/env deno run -A
// @deno-types="npm:@types/ethers"
import { ethers } from "https://esm.sh/ethers@6.11.1";

const wallet = ethers.Wallet.createRandom();
console.log("====== Ethereum Key Information ======");
console.log(`Private Key: ${wallet.privateKey}`);
console.log(`Account Address: ${wallet.address}`);
console.log("====================================");

実行

$ chmod +x gen-private-key.ts
$ ./gen-private-key.ts
====== Ethereum Key Information ======
Private Key: 0xf7f7dd810681fdc68a8ec217481310d91326a7d91a6809b1072ba01942a2611d
Account Address: 0x53c46e7c16AcF57Ef0C849A3aa53F565Efae3C81
====================================

とても楽です

Denoとは?

Deno は、Node.jsの作者Ryan Dahl氏が開発した新しいランタイムです。TypeScriptをそのまま実行でき、シングルバイナリで動作し、セキュリティもデフォルトで強化されています。

  • TypeScript/JavaScriptをそのまま実行
  • シングルバイナリでインストールが簡単
  • 権限管理がデフォルトで有効(安全)
  • npmパッケージやURLから直接import可能

インストール方法

公式サイトのInstallページ を参考に、以下のコマンドでインストールできます。

macOS/Linux (Homebrew)

brew install deno

Windows (PowerShell)

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

Node.jsでTypeScriptを実行する具体的な手順例

たとえば、先ほどの「Ethereum鍵ペアを生成するTypeScriptスクリプト」をNode.jsで実行する場合、以下のような手順が必要です。

  1. Node.js本体のインストール
  2. プロジェクトディレクトリの作成と初期化
mkdir sample-ts && cd sample-ts
npm init -y
  1. TypeScriptとts-node、型定義のインストール
npm install typescript ts-node @types/node ethers
  1. tsconfig.jsonの作成(最低限の設定)
npx tsc --init
  1. TypeScriptファイルの作成(例: generate-wallet.ts)
import { ethers } from "ethers";

const wallet = ethers.Wallet.createRandom();
console.log("====== Ethereum Key Information ======");
console.log(`Private Key: ${wallet.privateKey}`);
console.log(`Account Address: ${wallet.address}`);
console.log("====================================");
  1. スクリプトの実行
npx ts-node generate-wallet.ts

以上のように、たった1ファイルのTypeScriptを動かすだけでも、複数のnpmパッケージのインストールや設定ファイルの作成が必要です。 Denoなら「インストールして即実行」ですが、Node.jsではセットアップの手間が大きく異なります。

CDNからのモジュールインポート

Denoの大きな特徴の一つは、URLから直接モジュールをインポートできることです。サンプルコードでは以下のようにインポートしています:

import { ethers } from "https://esm.sh/ethers@6.11.1";

CDNインポートのメリット

  • package.jsonnode_modulesが不要
  • バージョンをURLに直接指定できる
  • 依存関係を明示的に表現できる
  • キャッシュされるため2回目以降は高速

主なCDNサービス

  • esm.sh - npmパッケージをESMに変換して提供
  • deno.land/x - Deno用モジュールのレジストリ
  • skypack.dev - npmパッケージをESM形式で提供
  • jspm.io - npmパッケージをESMに変換

型定義の利用

CDNインポートでも型定義を使用できます:

// @deno-types="npm:@types/ethers"
import { ethers } from "https://esm.sh/ethers@6.11.1";

// @deno-types コメントを使用することで、npmから型定義をダウンロードし、エディタの自動補完やコンパイル時の型チェックが機能します。

Denoの権限モデル: -A オプションの意味

サンプルコードの冒頭のシェバン(shebang)で使ってるDenoの起動オプションについて説明します。

#!/usr/bin/env deno run -A

この部分です。

Denoでは、セキュリティを重視するため「権限モデル」を採用しています。 -A (または --allow-all )オプションは、すべての権限をスクリプトに付与するフラグです。

主な権限フラグ

  • --allow-net=<domains> - 特定ドメインへのネットワークアクセスを許可(例: --allow-net=api.example.com
  • --allow-read=<paths> - 特定パスからのファイル読み取りを許可(例: --allow-read=./data
  • --allow-write=<paths> - 特定パスへのファイル書き込みを許可(例: --allow-write=./output
  • --allow-env - 環境変数へのアクセスを許可
  • --allow-run - 外部プログラムの実行を許可
  • -A または --allow-all - すべての権限を許可(開発時のみ推奨)

権限の組み合わせ例

# APIとファイル読み取りのみ許可
deno run --allow-net=api.example.com --allow-read=./config.json script.ts

-A--allow-all の略で、ネットワークやファイルアクセスなど、すべての権限をスクリプトに与えます。 Denoはデフォルトで非常にセキュアですが、外部APIやファイル操作が必要な場合は明示的に権限を付与する必要があります。

  • --allow-net ネットワークアクセス許可
  • --allow-read ファイル読み取り許可
  • --allow-write ファイル書き込み許可
  • -A すべて許可(開発時や信頼できるスクリプトのみ推奨)