Node.js®とは

非同期イベント駆動型のJavaScript実行環境であるNode.jsはスケール可能なネットワークアプリケーションを構築するために設計されています。次の「hello world」の例では多数のネットワーク接続を同時に処理できます。各ネットワーク接続でコールバックが呼び出されますが、実行する処理がない場合はNode.jsはスリープします。

const { function createServer<Request extends typeof IncomingMessage = typeof IncomingMessage, Response extends typeof ServerResponse = typeof ServerResponse>(requestListener?: RequestListener<Request, Response>): Server<Request, Response> (+1 overload)createServer } = 
var require: NodeJS.Require
(id: string) => any
require
('node:http');
const const hostname: "127.0.0.1"hostname = '127.0.0.1'; const const port: 3000port = 3000; const const server: Server<typeof IncomingMessage, typeof ServerResponse>server = createServer<typeof IncomingMessage, typeof ServerResponse>(requestListener?: RequestListener<typeof IncomingMessage, typeof ServerResponse> | undefined): Server<...> (+1 overload)createServer((req: IncomingMessagereq,
res: ServerResponse<IncomingMessage> & {
    req: IncomingMessage;
}
res
) => {
res: ServerResponse<IncomingMessage> & {
    req: IncomingMessage;
}
res
.ServerResponse<Request extends IncomingMessage = IncomingMessage>.statusCode: numberstatusCode = 200;
res: ServerResponse<IncomingMessage> & {
    req: IncomingMessage;
}
res
.
OutgoingMessage<IncomingMessage>.setHeader(name: string, value: number | string | readonly string[]): ServerResponse<IncomingMessage> & {
    req: IncomingMessage;
}
setHeader
('Content-Type', 'text/plain');
res: ServerResponse<IncomingMessage> & {
    req: IncomingMessage;
}
res
.
Stream.Writable.end(chunk: any, cb?: () => void): ServerResponse<IncomingMessage> & {
    req: IncomingMessage;
} (+2 overloads)
end
('Hello World');
}); const server: Server<typeof IncomingMessage, typeof ServerResponse>server.Server.listen(port?: number, hostname?: string, listeningListener?: () => void): Server<typeof IncomingMessage, typeof ServerResponse> (+8 overloads)listen(const port: 3000port, const hostname: "127.0.0.1"hostname, () => { var console: Consoleconsole.Console.log(message?: any, ...optionalParams: any[]): void (+1 overload)log(`Server running at http://${const hostname: "127.0.0.1"hostname}:${const port: 3000port}/`); });

これはOSのスレッドを使用する一般的な同時実行モデルとは対照的です。スレッドベースのネットワーク処理は比較的効率が悪く、使いこなすのが非常に難しくなります。さらにNode.jsではロックがないため、プロセスのデッドロックの心配から解放されます。Node.jsにはI/Oを直接実行する関数がほとんどないため、Node.js標準ライブラリーの同期メソッドを使用してI/Oが実行される場合を除いてプロセスがブロックされることはありません。何もブロックしないNode.jsでスケーラブルなシステムを開発するのは非常に合理的です。

もしこの内容に馴染みがない場合は、さらに詳しく解説しているBlocking vs. Non-Blockingを確認してください。


Node.jsはRubyのEvent MachineやPythonのTwistedに影響を受けており、似たシステム設計になっています。Node.jsはイベントモデルをもう少し深掘りしています。Node.jsはイベントループをライブラリーとしてではなく実行環境の構成要素として提供します。他のシステムではイベントループを開始するために常にブロック処理の呼び出しがあります。一般的にはスクリプトの最初にコールバックによって振る舞いが定義され、最後に EventMachine::run() のようなブロック処理の呼び出しによってサーバーが起動されます。Node.jsにはこのようなイベントループの開始時の呼び出しがありません。Node.jsは入力されたスクリプトを実行したあと、単にイベントループに入ります。Node.jsは実行するコールバックがなくなるとイベントループを終了します。この動作はブラウザー上のJavaScriptと同じでイベントループはユーザーから隠されています。

HTTPはNode.jsの中では第一級オブジェクトであり、ストリーミングや低レイテンシーを意識して設計されています。このためNode.jsはウェブのライブラリーやフレームワークの基盤として適しています。

Node.jsはスレッドを用いず設計されていますが、マルチコアを利用できないわけではありません。子プロセスはchild_process.fork() APIを使って作成でき、簡単に通信できるように設計されています。これと同じインターフェイスをもとに作られたのがclusterモジュールで、プロセス間でソケットを共有することでコアの負荷分散を行えます。

Node.js公式の情報源

Node.jsを利用する上で信頼性と安全性を確保するために、常に公式の情報源を確認してください。非公式の情報源からの電子メール、バイナリー、ダウンロード処理といったものを信用しないにしてください。

Node.js公式のドメイン

Node.jsのダウンロードと公式ドキュメントの参照は次のドメインのみを使用してください:

公式のnpmパッケージ

Node.jsチームは公式npmパッケージを次のスコープで管理しています:

さらにNode.jsチームはnodejs-foundationのnpmアカウントで公開されているパッケージを管理しています。 また、他のNode.js関連パッケージ(undiciのようなもの)もプロジェクトに密接に関係する貢献者によって管理されているかもしれません。

Node.jsチームのパッケージを利用することで公式にサポートされているNode.jsコンポーネントを利用していることが保証されます。

公式GitHub Organization

Node.jsとその関連プロジェクトは次の公式GitHub Organizationで管理されています:

公式コミュニケーションチャンネル

Node.jsとOpenJS Foundationはさまざまな公式チャネルやコミュニティがサポートするチャネルを通じて連携しています。参加方法の詳細は活動への参加ページにあります。

ウェブサイトの問題とダウンタイムの報告

Node.jsのウェブサイトで問題が発生した場合はNode.jsウェブサイトリポジトリーに報告してください。障害に関するリアルタイムの情報についてはNode.js Status Page をご確認ください。