src:
- [Introduction to Node.js](https://nodejs.dev/learn)
- [Node.js とは | Node.js](https://nodejs.org/ja/about/)
## 概要
> [!definition] Node.js とは
Node.js とはフリー、オープンソース、クロスプラットフォームの**JavaScript 実行環境**であり、デベロッパーにコマンドラインツールとブラウザ外のサーバーサイドスクリプトの開発を可能にさせる。
> > Node.js is a free, open-sourced, cross-platform **JavaScript run-time environment** that lets developers write command line tools and server-side scripts outside of a browser.
> > ([Run JavaScript Everywhere.](https://nodejs.dev/) より引用)
Node.js とは**スケーラブルな**ネットワークアプリケーションを構築するために設計された**非同期型のイベント駆動**の JavaScript 環境。
> As an **asynchronous event-driven JavaScript runtime**, Node.js is designed to **build scalable network applications**.
→ [[Node.jsのイベント駆動とは|イベント駆動]] を参照
以下の「Hello world」の例では、たくさんの接続を [[並行処理と並列処理の違い|concurrent]](並列) に処理することができる。各接続ごとにコールバックは発火され、何もすることがない場合には Node.js はスリープする。
参考: [[Node.jsとC10K問題]]
```js
const http = require('http');
const hostname = '127.0.0.1';
const pot = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World');
});
server.listen(port, hostname, () => {
console.log(`Server running at at http://${hostname}:${port}/`)
});
```
これは OS のスレッドが採用している一般的な並行実行モデル ([[並行処理と並列処理の違い|Concurrency]] mode) とは対照的になっている。
スレッドベースのネットワーキングは比較的非効率である上に、使うのがかなり難しい。
さらに、ブロッキングはないため、Node.js のユーザーはプロセスのデッドロッキングの心配をすることはない。
ほとんどの Node.js の関数は I/0 を直接実行しないため、プロセスを決してブロッキングしない。ただし、**Node.js の標準ライブラリにある同期的メソッドを使用して I/O を実行するときを除く**。基本的には、なにもブロッキングしないため、スケーラブルなシステムが開発できる。
Node.js は JavaScript 実行環境として Chrome で使われている [[V8 MOC|V8 JavaScriptエンジン]] をバックに搭載して動いている。
[The V8 JavaScript Engine](https://nodejs.dev/learn/the-v8-javascript-engine)
V8 自体は [[CPP MOC|C++]] で書かれており、クロスプラットフォームで走る。
## Node.js の利点
ドキュメントではブラウザとの対比を強調してるっぽい。ブラウザでも Node.js でも JavaScript を使っているが、ブラウザで動くアプリケーションと Node.js のアプリケーションを開発するのはまったく違う。
- [[JavaScript ブラウザ環境 MOC|ブラウザ環境]]
- [[JavaScript グローバルオブジェクト|グローバルオブジェクト]]
Node.js アプリケーションは大きな利点をもたらす。==フロントエンドとバックエンドで単一の言語で開発ができるということ==。[[JavaScriptのサーバーサイドとクライアントサイド|サーバーサイドとクライアントサイド]] で同一の言語を使えることが利点 [^1]。
[^1]: [Differences between Node.js and the Browser](https://nodejs.dev/learn/differences-between-nodejs-and-the-browser)
## Node.js を始める前に
初心者はどこから [[JavaScript MOC|JavaScript]] でどこから [[Node.js MOC|node]] なのかわからないので、まずは JavaScript から始めよう。
**非同期プログラミング**が Node の基本らしく、それらを理解する必要がある。
↓
[[JavaScriptの非同期処理 MOC|非同期処理]]