Node.jsとは?JavaScriptランタイムを解説
Node.jsはJavaScriptをブラウザの外で実行できるようにするランタイムで、サーバー、buildツール、そしてCI/CDのJavaScriptツールチェーンの大部分を支えています。
Node.jsはChromeのV8 JavaScriptエンジンを取り込み、ファイル、ネットワーク、プロセス向けのAPIで包むことで、JavaScriptがサーバーやコマンドライン上で動くようにしました。npm、bundler、test runner、そして数え切れないCIツールの土台となっています。
Node.jsとは
Node.jsはV8エンジン上に構築された、オープンソースでクロスプラットフォームなランタイムです。ファイルシステム、HTTP、stream、子プロセス向けの標準ライブラリと、パッケージをインポートできるモジュールシステムを提供します。JavaScriptで書かれたbuildスクリプトやtest runnerを実行するとき、それを実行しているのはNode.jsです。
イベントループ
Node.jsはシングルスレッドでノンブロッキングなイベントループを使います。遅いI/Oを待つ代わりに、callbackを登録して処理を続け、結果が揃い次第それらを処理します。これによりI/O負荷の高い処理に効率的になります。CPUバウンドな処理は依然としてループをブロックしうるため、重いタスクはしばしばworker threadや別プロセスにオフロードされます。
簡単な例
数行でHTTPサーバーを起動でき、ランタイムとその標準ライブラリを示せます。
import { createServer } from "node:http";
createServer((req, res) => {
res.end("hello from node");
}).listen(3000);CI/CDでの役割
Node.jsは、JavaScript以外のプロジェクトであってもCIのいたるところにあります。パッケージマネージャー、linter、bundler、そして多くのGitHub ActionsはNodeベースです。pipelineはNodeのバージョンを (多くはsetupステップや.nvmrcで) 固定し、buildが再現可能になるようにします。ローカルとCIでNodeのバージョンが食い違うことは「自分のマシンでは動く」型の失敗のよくある原因なので、バージョンは明示する価値があります。
代替ツール
DenoとBunはより新しいJavaScriptおよびTypeScriptのランタイムです。Denoはセキュリティと組み込みのTypeScriptを重視し、Bunは速度に注力し、パッケージマネージャーとtest runnerを同梱します。Node.jsは、その巨大なエコシステムと長期サポート版により、依然としてデフォルトの座を保っています。
重要なポイント
- Node.jsはV8エンジン上で、ブラウザの外でJavaScriptを実行します。
- そのノンブロッキングなイベントループはI/O負荷の高いワークロードに適しています。
- CI/CDのJavaScriptツールの大部分を支えます。再現性のあるbuildのためにバージョンを固定しましょう。