基本的なコマンドライン操作
Node.js環境での基本的なコマンドライン操作です。
目的 | コマンド | 説明 |
---|---|---|
REPL起動 | node |
Read-Eval-Print Loop を起動し、対話的にJavaScriptを実行できます。 |
スクリプト実行 | node [ファイル名].js |
指定したJavaScriptファイルを実行します。 |
バージョン確認 | node -v または node --version |
インストールされているNode.jsのバージョンを表示します。 |
コード片の評価 | node -e "[コード]" または node --eval "[コード]" |
コマンドラインから直接JavaScriptコードを実行します。例: node -e "console.log(1+1)" |
入力コードのチェック | node -c [ファイル名].js または node --check [ファイル名].js |
スクリプトを実行せずに構文エラーがないかチェックします。 |
モジュールシステム CommonJS & ES Modules
Node.jsでは主にCommonJSが使われてきましたが、ES Modules (ESM) も標準でサポートされています。
CommonJS (デフォルト)
操作 | コード例 | 説明 |
---|---|---|
モジュールのエクスポート | module.exports または exports を使って外部に公開する機能を定義します。module.exports は直接オブジェクトや関数を代入できます。 |
|
モジュールのインポート | require() 関数を使って他のモジュールを読み込みます。パスは相対パスまたはモジュール名を指定します。同期的に読み込まれます。 |
|
コアモジュールのインポート | Node.jsに組み込まれているモジュール(ファイルシステム、パス操作など)を読み込みます。 |
ES Modules (ESM)
ESMを使用するには、ファイル拡張子を .mjs
にするか、package.json
に "type": "module"
を追加します。
操作 | コード例 | 説明 |
---|---|---|
名前付きエクスポート | export キーワードを使って関数や変数を個別に公開します。 |
|
デフォルトエクスポート | export default を使って、モジュールから単一の主要な値を公開します。各モジュールに1つだけ設定できます。 |
|
名前付きインポート | import { ... } from '...' 構文で、名前付きエクスポートされた要素を読み込みます。 |
|
デフォルトインポート | import AnyName from '...' 構文で、デフォルトエクスポートされた値を読み込みます。AnyName は任意の名前にできます。 |
|
すべての名前付きインポート (Namespace Import) | import * as Name from '...' 構文で、すべての名前付きエクスポートを単一のオブジェクトにまとめて読み込みます。 |
|
CommonJS モジュールのインポート (ESM内から) | ESM内からCommonJSモジュールを import できます (Node.jsが変換)。コアモジュールも同様です。Dynamic import import() は Promise を返します。 |
import { ... }
で読み込むことは難しい場合があります。package.json
の "type"
フィールドの設定に注意してください。
ファイルシステム操作 (fs)
fs
モジュールはファイルシステムの操作を提供します。多くのメソッドには同期版 (Sync
) と非同期版 (コールバック、Promise) があります。非同期版の使用が推奨されます。
基本的なファイル操作 (Promiseベース)
require('fs').promises
または import { promises as fs } from 'fs';
で利用可能です。
目的 | コード例 (async/await) | 説明 |
---|---|---|
ファイル読み込み | ファイルを非同期に読み込みます。第二引数でエンコーディングを指定しない場合、Bufferオブジェクトが返ります。 | |
ファイル書き込み | ファイルに非同期に書き込みます。ファイルが存在しない場合は新規作成、存在する場合は上書きされます。 | |
ファイル追記 | ファイルに非同期に追記します。ファイルが存在しない場合は新規作成されます。 | |
ファイル/ディレクトリ存在確認 | ファイルやディレクトリの存在やアクセス権を確認します。存在しない場合やアクセス権がない場合にエラーがスローされます。非推奨: 古い `fs.exists` は使わないでください。 | |
ファイル情報取得 | ファイルやディレクトリのメタ情報 (サイズ、作成日時、最終アクセス日時など) を取得します。 | |
ファイル削除 | ファイルを非同期に削除します。 | |
ディレクトリ作成 | ディレクトリを非同期に作成します。recursive: true オプションが便利です。 |
|
ディレクトリ読み込み | ディレクトリ内のファイル名とサブディレクトリ名のリストを非同期に取得します。 | |
ディレクトリ削除 | ディレクトリを非同期に削除します。空でないディレクトリを削除するには recursive: true が必要です (fs.rm 推奨)。 |
|
名前の変更/移動 | ファイルやディレクトリの名前を変更したり、別の場所に移動したりします。 |
パス操作 (path)
ファイルパスの操作には path
モジュールを使います。OS間の互換性を保つのに役立ちます。
目的 | コード例 | 説明 |
---|---|---|
パスの結合 | 複数のパスセグメントを結合して、プラットフォームに適したパス文字列を生成します。.. や . も解釈されます。 |
|
絶対パスの解決 | 相対パスから絶対パスを解決します。引数なしだとカレントワーキングディレクトリを返します。 | |
ディレクトリ名取得 | パス文字列からディレクトリ部分を取得します。 | |
ファイル名取得 | パス文字列からファイル名部分(拡張子含む)を取得します。第二引数で拡張子を指定すると、それを取り除いた名前を取得できます。 | |
拡張子取得 | パス文字列から拡張子(ドット. を含む)を取得します。 |
|
パスの正規化 | パス文字列を正規化します(余分な/ 、. 、.. を解決)。 |
|
プラットフォーム固有の区切り文字 | 現在のOSのパス区切り文字を取得します。 |
非同期処理
Node.js の中心的な概念です。I/O操作などは基本的にノンブロッキング(非同期)で行われます。
コールバック関数
非同期操作が完了したときに呼び出される関数です。エラーファーストコールバック (Error-first Callback) が一般的です。
Promise
非同期操作の最終的な結果(成功または失敗)を表すオブジェクトです。.then()
で成功時、.catch()
で失敗時の処理をチェーンできます。
async/await
Promise をより同期的なコードのように書けるようにするシンタックスシュガーです。async
関数内で await
を使って Promise の解決を待ちます。エラーハンドリングには try...catch
を使います。
Promise Combinators
メソッド | コード例 | 説明 |
---|---|---|
Promise.all() |
複数の Promise がすべて成功するのを待ちます。結果は配列で返されます。一つでも失敗すると全体が失敗(reject)します。並列実行したい場合に便利です。 | |
Promise.allSettled() |
複数の Promise の結果(成功・失敗問わず)を待ちます。各 Promise の結果が { status: 'fulfilled', value: ... } または { status: 'rejected', reason: ... } の形式で配列に格納されます。 |
|
Promise.race() |
複数の Promise のうち、最初に成功または失敗したものの結果を返します。 | |
Promise.any() |
複数の Promise のうち、最初に成功したものの結果を返します。すべてが失敗した場合のみ、AggregateError で失敗します。 |
ストリーム (Streams)
ストリーム は、大きなデータを扱う際や、データを少しずつ処理する際にメモリ効率良く扱うための仕組みです。ファイル操作、HTTPリクエスト/レスポンス、プロセス間通信などで使われます。
基本的なストリーム操作
目的 | コード例 | 説明 |
---|---|---|
Readable Stream からのデータ読み込み | 'data' イベントでデータの断片 (chunk) を受け取ります。'end' イベントで完了、'error' イベントでエラーをハンドリングします。 |
|
Writable Stream へのデータ書き込み | write() メソッドでデータを書き込みます。end() を呼び出すと、残りのデータを書き込んでストリームを終了します。完了は 'finish' イベントで検知します。 |
|
パイプ (pipe() ) |
Readable Stream の出力を Writable Stream の入力に繋ぎます。データの流れを簡単に記述でき、背圧(バックプレッシャー)も自動で処理されます。複数のストリームを連結できます。非常に効率的です。 | |
stream.pipeline() |
pipe() と似ていますが、エラーハンドリングが改善されており、最後のコールバック(またはPromise)ですべてのストリームのエラーをまとめて扱えます。ストリームのクリーンアップも自動で行われます。pipe() よりも推奨されます。 |
HTTPサーバー/クライアント (http, https)
http
および https
モジュールで、HTTP通信を扱います。通常、Webフレームワーク (Express, Fastify など) を使うことが多いですが、基本的な動作を理解しておくことは重要です。
HTTPサーバーの作成
createServer
にリクエストハンドラ関数を渡します。listen
でサーバーを指定ポートで起動します。
HTTPクライアント (リクエスト送信)
Node.js v18以降では、標準で fetch
API が利用可能になり、より簡単にHTTPリクエストを送信できます。
fetch
API (推奨)
従来の http.request
/ https.request
より低レベルな操作が必要な場合や古いNode.jsバージョンで利用します。
fetch
API は Promise ベースで async/await との相性が良く、ブラウザ環境の `fetch` と似たインターフェースを持つため、学習コストが低く、コードも簡潔になります。可能な限り fetch
の利用を検討しましょう。
イベント (Events)
Node.js の多くのオブジェクトは EventEmitter
を継承しており、イベント駆動型のプログラミングが可能です。ストリーム、HTTPサーバー、プロセスなどがイベントを発行します。
EventEmitter の利用
'error'
イベントには必ずリスナーを登録するようにしましょう。予期せぬプロセス終了を防ぐことができます。
プロセス管理 (Process)
Node.js の process
オブジェクトは、現在実行中の Node.js プロセスに関する情報を提供し、制御するためのグローバルオブジェクトです。
プロパティ/メソッド | コード例 | 説明 |
---|---|---|
process.argv |
コマンドライン引数の配列を取得します。最初の2つはNode実行ファイルとスクリプトファイルパスです。 | |
process.env |
環境変数を格納したオブジェクトです。NODE_ENV はよく ‘development’ や ‘production’ を設定するのに使われます。 |
|
process.cwd() |
現在のワーキングディレクトリ(Node.jsプロセスが起動されたディレクトリ)のパスを返します。 | |
process.exit([code]) |
プロセスを同期的に終了させます。終了コードを指定できます (デフォルトは0)。注意: 実行中の非同期処理は完了しない可能性があります。通常は自然に終了させるのが望ましいです。 | |
process.pid |
現在のプロセスのIDを返します。 | |
process.platform |
実行中のオペレーティングシステムプラットフォームを示す文字列を返します。 | |
process.uptime() |
Node.js プロセスが起動してからの経過時間を秒単位で返します。 | |
process.memoryUsage() |
プロセスのメモリ使用状況をバイト単位で返します (rss: Resident Set Size、heapTotal/Used: V8ヒープ)。 | |
process.on('uncaughtException') |
try...catch でキャッチされなかった例外が発生したときにトリガーされるイベント。最後の手段であり、実行後にプロセスを終了することが強く推奨されます。 |
|
process.on('unhandledRejection') |
.catch() で処理されなかった Promise の rejection が発生したときにトリガーされるイベント。ログ記録などに使用します。 |
子プロセスの生成 (child_process)
外部コマンドや他のスクリプトを実行するために子プロセスを生成します。
メソッド | 特徴 | 主な用途 |
---|---|---|
exec() |
シェル経由でコマンド実行。出力をバッファリング。非同期。 | 簡単なコマンド実行、シェルの機能(パイプ、リダイレクトなど)を利用したい場合。出力が大きすぎると問題になる可能性あり。 |
execFile() |
直接実行ファイルを実行(シェルを介さない)。出力をバッファリング。非同期。 | 特定の実行ファイルを直接実行したい場合。exec より若干効率的で安全。出力サイズに注意。 |
spawn() |
直接実行ファイルを実行。ストリームで入出力を扱う。非同期。 | 出力が大きい場合、リアルタイムでデータを処理したい場合、プロセスとの対話が必要な場合。最も柔軟で推奨される方法。 |
fork() |
新しいNode.jsプロセスを生成 (spawn の特殊版)。IPCチャネルが組み込まれる。非同期。 |
CPU負荷の高いタスクを別プロセスに分離したい場合、プロセス間通信を行いたい場合。 |
execSync() execFileSync() spawnSync() |
上記メソッドの同期版。完了するまでNode.jsのイベントループをブロックする。 | 簡単なスクリプトやビルドプロセスなど、ブロッキングが許容される場合。サーバーアプリケーションなどでは避けるべき。 |
spawn
の例
エラーハンドリング
堅牢なアプリケーションのためには、適切なエラーハンドリングが不可欠です。
種類 | ハンドリング方法 | 説明・注意点 |
---|---|---|
同期エラー | try...catch |
JSONのパースエラー (JSON.parse )、未定義プロパティへのアクセス試行など、同期的に発生するエラー。 |
非同期エラー (コールバック) | エラーファーストコールバックの err 引数チェック |
Node.jsコアAPIの多くで使われるパターン。コールバック関数の最初の引数がエラーオブジェクト(エラーがなければ null or undefined )。 |
非同期エラー (Promise) | .catch() メソッド or try...catch (async/await内) |
Promiseチェーンの最後や、async 関数内でawait を使った箇所でエラーを捕捉。 |
非同期エラー (EventEmitter) | 'error' イベントリスナー |
ストリーム、サーバーなどで発生するエラー。'error' イベントをリッスンしないと、uncaughtException になる場合がある。 |
未捕捉の例外 | process.on('uncaughtException') |
どこでもキャッチされなかった同期・非同期エラー。最後の砦。 ログ記録後、プロセスを終了するのがベストプラクティス。アプリケーションを安全な状態に保てない可能性があるため、続行は非推奨。 |
未処理のPromise Rejection | process.on('unhandledRejection') |
.catch() がない、または await の try...catch がない Promise の reject。ログ記録推奨。将来的には uncaughtException 同様にプロセス終了がデフォルトになる可能性あり。
|
エラーオブジェクト
エラーハンドリング時には、エラーオブジェクトのプロパティを確認すると役立ちます。
error.message
: エラーメッセージ文字列。error.stack
: エラースタックトレース。どこでエラーが発生したか追跡するのに役立つ。error.code
: (Node.jsのエラーなどで) 特定のエラーを示すコード文字列 (例:'ENOENT'
– ファイルが存在しない)。err.code
をチェックすることで、特定のエラー状況に対応しやすくなる。- カスタムエラープロパティ: 自分で定義したエラークラスに独自のプロパティを追加することも可能。
パッケージ管理 (npm / yarn)
Node.js プロジェクトの依存関係(外部ライブラリ)を管理するためのツールです。npm は Node.js に同梱されています。yarn は代替ツールとして人気があります。
目的 | npm コマンド | yarn コマンド | 説明 |
---|---|---|---|
プロジェクト初期化 | npm init [-y] |
yarn init [-y] |
package.json ファイルを作成します。-y オプションですべての質問にデフォルトで回答します。 |
依存パッケージのインストール | npm install [pkg] npm i [pkg] |
yarn add [pkg] |
パッケージをインストールし、dependencies に追加します。[pkg] を省略すると package.json の依存関係をすべてインストールします。 |
開発時依存パッケージのインストール | npm install [pkg] --save-dev npm i [pkg] -D |
yarn add [pkg] --dev yarn add [pkg] -D |
テストフレームワークやビルドツールなど、開発時にのみ必要なパッケージをインストールし、devDependencies に追加します。 |
グローバルインストール | npm install [pkg] --global npm i [pkg] -g |
yarn global add [pkg] |
コマンドラインツールなどをシステム全体で利用可能にするためにインストールします。 |
パッケージのアンインストール | npm uninstall [pkg] npm un [pkg] |
yarn remove [pkg] |
パッケージをアンインストールし、package.json から削除します。 |
パッケージのアップデート | npm update [pkg] |
yarn upgrade [pkg] |
package.json のバージョン指定範囲内でパッケージを更新します。[pkg] を省略するとすべて更新します。 |
依存関係の確認 (旧バージョン/更新可能) | npm outdated |
yarn outdated |
現在のバージョン、package.json で要求されているバージョン、最新バージョンを表示します。 |
スクリプトの実行 | npm run [script-name] |
yarn [script-name] |
package.json の "scripts" セクションに定義されたコマンドを実行します。start , test など一部は run を省略可能です (npm)。 |
キャッシュクリア | npm cache clean --force |
yarn cache clean |
ダウンロードされたパッケージのローカルキャッシュを削除します。問題発生時に試すことがあります。 |
パッケージ公開 (npmレジストリへ) | npm publish |
yarn publish |
自作のパッケージをnpmレジストリに公開します (npmアカウントとログインが必要です)。 |
インストール (ロックファイル基準) | npm ci |
yarn install --frozen-lockfile |
package-lock.json または yarn.lock に基づいて依存関係をクリーンインストールします。CI/CD環境での再現性を高めるのに役立ちます。node_modules を削除してからインストールします。 |
package.json
: プロジェクト名、バージョン、依存関係、スクリプトなどを記述する設定ファイル。package-lock.json
(npm) / yarn.lock
(yarn): インストールされた各パッケージの正確なバージョンと依存関係ツリーを記録するロックファイル。これにより、異なる環境でも同じ依存関係を再現できます。バージョン管理に含めるべきです。
デバッグ
Node.js アプリケーションのデバッグにはいくつかの方法があります。
方法 | コマンド/設定 | 説明 |
---|---|---|
console デバッグ |
console.log() console.error() console.warn() console.trace() console.time() / console.timeEnd() |
最もシンプル。コードの途中にログ出力ステートメントを挿入して、変数の値や処理の通過点を確認します。trace でスタックトレース、time /timeEnd で時間計測ができます。 |
Node.js Inspector (内蔵デバッガ) | node inspect [ファイル名].js または node --inspect [ファイル名].js node --inspect-brk [ファイル名].js |
Node.js に組み込まれているデバッグプロトコル (V8 Inspector) を利用します。 – inspect : REPL風のコマンドラインデバッガを起動します。– --inspect : デバッグプロトコルを有効にし、実行を続けます。Chrome DevTools や VS Code などのデバッグクライアントから接続できます。– --inspect-brk : デバッグプロトコルを有効にし、スクリプトの最初の行で実行を一時停止します。クライアントからの接続を待機します。
|
Chrome DevTools でデバッグ | 1. node --inspect-brk app.js などで起動。2. Chrome ブラウザで chrome://inspect を開く。3. “Remote Target” に表示される Node.js プロセスを選択。 |
使い慣れた Chrome DevTools のインターフェース (ブレークポイント、ステップ実行、変数監視、コンソール、プロファイリングなど) を使って Node.js アプリケーションをデバッグできます。非常に強力です。 |
VS Code デバッガ | 1. VS Code でプロジェクトを開く。 2. “実行とデバッグ” (Run and Debug) サイドバーを開く。 3. launch.json 設定ファイルを作成 (Node.js 用のデフォルト設定あり)。4. デバッグを開始 (F5)。 |
VS Code に統合された高機能なデバッガを利用できます。ブレークポイントの設定、ステップ実行、変数監視、コールスタック表示、デバッグコンソールなどがエディタ内で完結します。launch.json で起動設定を細かくカスタマイズ可能です (--inspect 相当の機能が内部で使われます)。 |
debugger ステートメント |
コード内に debugger; と記述。 |
コード内にこのステートメントがあると、デバッガ (Chrome DevTools や VS Code デバッガなど) が接続されている場合に、その箇所で実行が一時停止します。プログラム的にブレークポイントを設定するようなものです。 |
console.log
は手軽ですが、複雑な問題にはデバッガが適しています。