【徹底解説】 Node.js × TypeScript でのモジュール読み込み: require と ESM の違い
Node.js で TypeScript ファイル内から require を使用する方法
2 つの主要な方法があります:
CommonJS:
これは Node.js の伝統的なモジュールシステムです。
const fs = require('fs'); // 'fs' モジュールを読み込む
const data = fs.readFileSync('data.txt'); // ファイルを読み込む
console.log(data.toString()); // ファイルの内容をコンソールに出力
ES Modules (ESM):
これは JavaScript と TypeScript の新しいモジュールシステムです。
import * as fs from 'fs'; // 'fs' モジュールをすべてインポート
fs.readFile('data.txt', (err, data) => {
if (err) throw err;
console.log(data.toString());
});
どちらの方法を使用するか:
- 新しいプロジェクトの場合は、ESM を使用することをお勧めします。
- 既存のプロジェクトで CommonJS を使用している場合は、引き続き CommonJS を使用できます。
- TypeScript ファイルの拡張子を
.mjs
にすると、必ず ESM として解釈されます。 - CommonJS 互換性が必要な場合は、
.cjs
拡張子を使用できます。 - TypeScript コンパイラは、
--esModuleInterop
フラグを使用して、CommonJS と ESM モジュールの相互運用を可能にします。
// ファイル: app.ts
const fs = require('fs'); // 'fs' モジュールを読み込む
function readFile(path: string): Promise<string> {
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf8', (err, data) => {
if (err) {
reject(err);
return;
}
resolve(data);
});
});
}
async function main() {
const data = await readFile('data.txt');
console.log(data);
await writeFile('output.txt', data + '\n新しい行を追加しました');
console.log('ファイルを書き込みました');
}
main();
// ファイル: app.ts
import * as fs from 'fs'; // 'fs' モジュールをすべてインポート
async function main() {
const data = await readFile('data.txt');
console.log(data);
await writeFile('output.txt', data + '\n新しい行を追加しました');
console.log('ファイルを書き込みました');
}
async function readFile(path: string): Promise<string> {
const data = await fs.promises.readFile(path, 'utf8');
return data;
}
async function writeFile(path: string, data: string): Promise<void> {
await fs.promises.writeFile(path, data);
}
main();
説明:
- これらの例では、
readFile
とwriteFile
という 2 つの非同期関数を作成します。 - これらの関数は、
fs
モジュールの非同期 API を使用してファイルを非同期に読み書きします。 main
関数は、readFile
関数を使用してファイルを非同期に読み込み、その内容をコンソールに出力します。- 次に、
writeFile
関数を使用してファイルに新しい行を追加します。
- このコードは、Node.js と TypeScript がインストールされていることを前提としています。
- コードを実行するには、
tsc
コマンドを使用して TypeScript ファイルを JavaScript にコンパイルする必要があります。 - その後、Node.jsを使用してコンパイルされた JavaScript ファイルを実行できます。
ts-node
は、TypeScript ファイルを直接実行するための Node.js パッケージです。
ts-node
を使用すると、require
キーワードを使用して CommonJS モジュールをインポートできます。
// ファイル: app.ts
const fs = require('fs'); // 'fs' モジュールを読み込む
// ... (上記と同じコード)
Dynamic Import:
Dynamic Import は、ES Modules でモジュールを非同期にロードする機能です。
// ファイル: app.ts
async function main() {
const { readFile, writeFile } = await import('fs'); // 'fs' モジュールを非同期にインポート
const data = await readFile('data.txt');
console.log(data);
await writeFile('output.txt', data + '\n新しい行を追加しました');
console.log('ファイルを書き込みました');
}
main();
Third-party modules:
@types/node
- TypeScript 用の Node.js 標準ライブラリの型定義を提供します。 これにより、require
キーワードを使用する際に IntelliSense を利用できます。ts-nodegen
- TypeScript ファイルから CommonJS 互換のモジュール定義ファイルを自動的に生成するツールです。
これらの方法は、特定の状況で役立つ場合があります。
node.js typescript