Node.js
Chrome V8 エンジン上で動作するサーバーサイド JavaScript ランタイム
Node.js とは
Node.js は、Chrome の V8 JavaScript エンジンをベースにしたサーバーサイドランタイムである。2009 年に Ryan Dahl が開発し、ノンブロッキング I/O とイベントループによる高い並行処理性能が特徴。AWS Lambda のデフォルトランタイムの 1 つでもある。
シングルスレッド + イベントループ
Node.js はシングルスレッドだが、イベントループとノンブロッキング I/O で大量の同時接続を処理する。
リクエスト → イベントループ → I/O 操作 (非同期) → コールバック → レスポンス
↑ |
└────────────────────────────────────┘
CPU バウンドな処理 (画像変換、暗号計算) はイベントループをブロックするため、Worker Threads や外部サービスに委譲する。
Node.js vs Deno vs Bun
Node.js と Deno vs Bun の違いを以下にまとめる。
| 観点 | Node.js | Deno | Bun |
|---|---|---|---|
| エンジン | V8 | V8 | JavaScriptCore |
| パッケージ | npm | URL import / npm | npm |
| TypeScript | トランスパイル必要 | ネイティブ対応 | ネイティブ対応 |
| セキュリティ | 制限なし | パーミッション制御 | 制限なし |
| エコシステム | 最大 | 成長中 | 成長中 |
Node.js の最大の強みはエコシステムの規模。npm には 200 万以上のパッケージがあり、ほぼあらゆるユースケースにライブラリが存在する。
Lambda での Node.js
Lambda は Node.js ランタイムを公式サポートしており、コールドスタートが軽量 (Python と並んで最速クラス)。
| 観点 | Node.js | Python | Java |
|---|---|---|---|
| コールドスタート | 100〜300ms | 100〜300ms | 1〜5s |
| 実行速度 | 高速 | 中程度 | 高速 |
| メモリ効率 | 良好 | 良好 | 大きい |
CommonJS vs ES Modules
CommonJS と ES Modules のコード例を比較する。
// CommonJS (従来)
const fs = require('fs');
module.exports = { handler };
// ES Modules (推奨)
import { readFile } from 'fs/promises';
export const handler = async (event) => { /* ... */ };
Lambda は ES Modules をサポートしており、package.json に "type": "module" を指定するか、ファイル拡張子を .mjs にする。
よくある落とし穴
- イベントループのブロック:
JSON.parseで巨大な JSON を処理すると他のリクエストが待たされる - メモリリーク: クロージャやグローバル変数にデータを蓄積し続けると Lambda の実行環境が肥大化する
- コールバック地獄:
async/awaitを使わずにコールバックをネストすると可読性が崩壊する node_modulesの肥大化: Lambda のデプロイパッケージが 250MB 制限に達する。Lambda Layer や Tree Shaking で対策する
関連書籍も参考になる。
この記事は役に立ちましたか?
関連用語
イベントループ
Node.js のシングルスレッドで非同期 I/O を実現する実行モデル
非同期プログラミング
I/O 待ちの間に他の処理を進め、システムのスループットを向上させるプログラミング手法
Lambda
AWS のサーバーレスコンピューティングサービスで、コードをイベント駆動で実行する
コールドスタート
Lambda の初回呼び出し時に実行環境の初期化が発生し、レイテンシが増加する現象
並行処理
複数のタスクを論理的に同時に進行させるプログラミング手法で、システムのスループットと応答性を向上させる
Worker Threads
Node.js で CPU 集約的な処理をメインスレッドをブロックせずに別スレッドで実行する仕組み