TypeScriptの開発環境を構築する際、コードをコンパイルしてから実行するという手順を手間に感じたことはないでしょうか。
TypeScriptを直接実行できる実行エンジンである「ts-node」は、開発効率を劇的に向上させるツールとして長らく愛用されています。
Node.jsは標準でJavaScriptを実行しますが、TypeScript(.tsファイル)をそのまま理解することはできません。
通常は tsc コマンドでJavaScriptへ変換(コンパイル)してから実行する必要がありますが、ts-nodeを使用すれば、内部でこのプロセスを自動化し、あたかも TypeScriptを直接ネイティブ実行しているかのような体験を提供します。
本記事では、2026年現在の開発シーンに合わせ、ts-nodeの基本的な使い方から、近年標準となったES Modules(ESM)への対応、さらには実行速度を向上させるための高度な設定までを詳しく解説します。
ts-nodeの基本概念と導入のメリット
ts-nodeは、Node.js上でTypeScriptを直接実行するための実行環境(REPL機能含む)です。
内部的には、TypeScriptコンパイラをラップしており、実行時にメモリ上でトランスパイルを行う仕組みを採用しています。
なぜts-nodeが必要なのか
開発中にコードを少し変更するたびに、コンパイルコマンドを実行し、生成されたJSファイルを指定して実行するのは効率的ではありません。
ts-nodeを導入することで、編集から実行までのフィードバックループを最短化できます。
特に以下のシーンでその威力を発揮します。
- サーバーサイド(Node.js)アプリケーションのローカル開発
- TypeScriptで記述されたコマンドラインツール(CLI)の実行
- ライブラリの動作確認やプロトタイピング
- 単体テストの実行環境
ts-nodeの動作環境
2026年現在、Node.jsのLTS(Long Term Support)バージョンは22系や24系が主流となっています。
ts-nodeはこれらのモダンなNode.js環境においても、適切な設定を施すことで安定して動作します。
ただし、Node.js自体のESM(ES Modules)推進に伴い、従来とは異なる設定が必要になるケースが増えている点には注意が必要です。
ts-nodeのインストール手順
ts-nodeを使用するためには、本体だけでなくTypeScriptコンパイラ自体もプロジェクトにインストールされている必要があります。
ローカルインストール(推奨)
プロジェクトごとに依存関係を管理するため、プロジェクトローカルへのインストールを推奨します。
# プロジェクトディレクトリの作成と移動
mkdir my-ts-project
cd my-ts-project
# npmの初期化
npm init -y
# ts-nodeとtypescriptのインストール
npm install -D ts-node typescript
added 2 packages, and audited 3 packages in 2s
グローバルインストール
特定のプロジェクトに限らず、手軽にスクリプトを動かしたい場合はグローバルインストールも可能です。
npm install -g ts-node typescript
ただし、チーム開発においては環境の差異を防ぐため、必ずプロジェクトごとのローカルインストールを併用するようにしましょう。
基本的な使い方とスクリプト実行
インストールが完了したら、実際にTypeScriptファイルを作成して実行してみましょう。
TypeScriptファイルの作成
まずは簡単なサンプルコードを作成します。
// index.ts
// インターフェースの定義
interface User {
id: number;
name: string;
role: 'admin' | 'user';
}
// 関数の定義(型定義を含む)
const greet = (user: User): string => {
return `Hello, ${user.name}! Your role is ${user.role}.`;
};
// データの作成
const currentUser: User = {
id: 1,
name: "TechWriter",
role: "admin"
};
// 実行
console.log(greet(currentUser));
ts-nodeでの実行
作成したファイルを ts-node コマンドで実行します。
ローカルインストールした場合は npx を経由します。
npx ts-node index.ts
Hello, TechWriter! Your role is admin.
このように、JavaScriptへの書き出しを意識することなく、即座に実行結果を得ることができます。
REPLモードの活用
引数なしで ts-node を実行すると、対話型実行環境(REPL)が起動します。
npx ts-node
> const m: number = 10;
undefined
> m * 2
20
ちょっとした型定義の挙動確認や、関数のテストに非常に便利です。
ES Modules(ESM)への対応設定
近年のNode.jsエコシステムでは、CommonJS(CJS)からES Modules(ESM)への移行がほぼ完了しています。
しかし、ts-nodeをデフォルトのままESM環境で動かそうとすると、ERR_UNKNOWN_FILE_EXTENSION などのエラーに遭遇することがあります。
2026年の標準的な開発環境において、ESMでts-nodeを動かすための手順を解説します。
package.jsonの設定
まず、プロジェクト全体をESMとして扱うように設定します。
{
"name": "my-ts-esm-project",
"type": "module",
"devDependencies": {
"ts-node": "^10.9.x",
"typescript": "^5.x.x"
}
}
tsconfig.jsonの設定
次に、TypeScriptの設定ファイルで、ESM向けのトランスパイルを行うように指定します。
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"esModuleInterop": true,
"skipLibCheck": true,
"strict": true
},
"ts-node": {
"esm": true,
"experimentalSpecifierResolution": "node"
}
}
実行コマンドの変更
Node.jsのモダンなバージョンでは、Loader APIを使用してts-nodeをフックする必要があります。
# Node.js 20.x以降の推奨実行方法
node --loader ts-node/esm index.ts
あるいは、ts-nodeが提供するバイナリを直接使う場合は以下のようになります。
npx ts-node-esm index.ts
ESM環境下では、インポート時のファイル拡張子を省略できない(または .ts ではなく出力後の .js を書く必要がある)といったTypeScript独自の制約が発生しますが、ts-nodeの experimentalSpecifierResolution 設定を有効にすることで、Node.jsに近い挙動を再現できます。
実行速度の最適化:swcの利用
ts-nodeの弱点は、実行のたびに型チェックを行うため、ファイル数が増えると起動が遅くなることです。
これを解決するために、Rust製の超高速コンパイラ「swc」をバックエンドに使用する設定を導入しましょう。
swcのインストール
まず、必要なパッケージを追加します。
npm install -D @swc/core @swc/helpers regenerator-runtime
ts-nodeでswcを有効にする
tsconfig.json の ts-node セクションに追記します。
{
"ts-node": {
"swc": true,
"transpileOnly": true
}
}
transpileOnly: true を指定することで、実行時の型チェックをスキップし、純粋なトランスパイルのみを行います。
これにより、起動速度が数倍から数十倍に高速化されます。
型チェックについては、エディタ(VS Codeなど)や、別途 tsc --noEmit を実行することで担保するのが、モダンな開発におけるベストプラクティスです。
Nodemonとの連携による開発自動化
コードを変更するたびに手動でコマンドを叩くのは非効率です。
ファイルの変更を検知して自動的に再実行してくれる nodemon と ts-node を組み合わせる方法を解説します。
設定手順
nodemonをインストールします。
npm install -D nodemonプロジェクトのルートに
nodemon.jsonを作成します。
{
"watch": ["src"],
"ext": "ts",
"exec": "npx ts-node src/index.ts"
}
package.jsonにスクリプトを登録します。
"scripts": {
"dev": "nodemon"
}
これで、npm run dev を実行するだけで、ソースコードを保存するたびに即座にTypeScriptコードが再実行される環境が整います。
よくあるトラブルと解決策
ts-nodeを使用していると、いくつか特有のエラーに遭遇することがあります。
1. ERR_UNKNOWN_FILE_EXTENSION
原因:ESMプロジェクトで、Node.jsが .ts ファイルを解釈しようとして失敗しています。
解決策:上述したように --loader ts-node/esm を使用するか、tsconfig.json で "esm": true を設定してください。
2. TypeError [ERR_UNKNOWN_FILE_EXTENSION] (モジュールが見つからない)
原因:相対パスでのインポート時に拡張子が含まれていない。
解決策:TypeScript 5.x系であれば、tsconfig.json の moduleResolution を Bundler または NodeNext に設定し、適切にパスを解決させる必要があります。
3. メモリ不足エラー
原因:大規模なプロジェクトで型チェックが重すぎる。
解決策:--transpile-only フラグを付けて実行し、型チェックを無効化してください。
まとめ
ts-nodeは、TypeScript開発において欠かすことのできない強力なツールです。
2026年現在の開発環境においては、単にインストールするだけでなく、ESMへの適切な対応と、swcによる高速化設定を組み合わせることが、快適な開発体験を得るための鍵となります。
最後に、本記事で解説した重要ポイントをまとめます。
| 項目 | 内容 |
|---|---|
| 基本機能 | TypeScriptファイルをコンパイルなしで直接実行する |
| ESM対応 | ts-node/esm ローダーの使用が必要 |
| 高速化 | swc: true 設定により実行速度を劇的に改善 |
| 自動化 | nodemon との組み合わせでホットリロードを実現 |
まずは小規模なスクリプトから ts-node を導入し、その利便性を体感してみてください。
プロジェクトが成長しても、適切な設定(transpileOnlyなど)を施すことで、長く使い続けることができるはずです。
今回紹介した設定を参考に、効率的なTypeScript開発ライフを送りましょう。
