【Node.js】初心者必見！ゼロから学べる実践入門

Node.jsとは？
---
Node.jsは、GoogleのV8 JavaScriptエンジン上に構築された、イベント駆動、非同期I/Oを備えたJavaScriptランタイムです。
これにより、高いパフォーマンスを保ちながら非同期処理を行うことができます。

Node.jsインストール
---
https://nodejs.jp/

npm（Node Package Manager）
---
Node.jsのためのパッケージ管理ツールです。
これにより、JavaScriptのライブラリやツールを簡単にインストール、管理、共有することができます。
npmは、依存関係の管理やバージョン管理を行い、開発プロジェクトを効率的にサポートします。

基本的なnpmコマンド
---
`npm init`: 新しいNode.jsプロジェクトのためのpackage.jsonファイルを作成します。
`npm install <package-name>`: 指定したパッケージをインストールします。
`npm uninstall <package-name>`: 指定したパッケージをアンインストールします。
`npm update`: インストールされたパッケージを最新のバージョンに更新します。
`npm list`: インストールされているパッケージとそのバージョンを表示します。

package.jsonの活用
---
プロジェクトの設定や依存関係を管理する重要なファイルです。
npm initコマンドで生成され、以下のような情報が含まれます。
`name`: プロジェクト名
`version`: プロジェクトのバージョン
`scripts`: 実行可能なスクリプト
`dependencies`: プロジェクトが依存しているパッケージ
`devDependencies`: 開発時にのみ必要なパッケージ

``` package.json
{
  "name": "my-project",
  "version": "1.0.0",
  "scripts": {
    "start": "node index.js",
    "test": "jest"
  },
  "dependencies": {
    "express": "^4.17.1"
  },
  "devDependencies": {
    "jest": "^26.6.3"
  }
}
```
スクリプトの設定
---
package.jsonのscriptsセクションでは、プロジェクトのビルドやテスト、その他のタスクを実行するためのコマンドを定義できます。
例えば、startというスクリプトを定義して、node index.jsを実行することができます。
```
npm run start
```

モジュールとパッケージ管理
---
``` readFile.js
const fs = require('fs');

fs.readFile('hello.js', 'utf8', (err, data) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(data);
});
```
このコードを実行すると、hello.jsの内容が表示されます。

次に、npmを使って外部パッケージをインストールし、利用してみましょう。
ここでは、HTTPリクエストを簡単に行えるaxiosパッケージを使ってみます。

まず、プロジェクトのルートディレクトリで以下のコマンドを実行してpackage.jsonを作成します。
```
npm init -y
```
次に、axiosパッケージをインストールします。
```
npm install axios
```

axiosExample.jsというファイルを作成し、以下のコードを記述します。
``` axiosExample.js
const axios = require('axios');

axios.get('https://jsonplaceholder.typicode.com/todos/1')
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error(error);
  });
```
このコードを実行すると、外部APIからデータを取得し、表示します。

簡単なウェブサーバーの作成
---
Node.jsの強力な機能の一つに、簡単にウェブサーバーを作成できる点があります。
httpモジュールを使って、簡単なウェブサーバーを作成してみましょう。

``` server.js
const http = require('http');

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello, World!\n');
});

const PORT = 3000;
server.listen(PORT, () => {
  console.log(`Server running at http://localhost:${PORT}/`);
});
```
このコードを実行すると、ローカルホストの3000番ポートでウェブサーバーが立ち上がります。
ブラウザで`http://localhost:3000`にアクセスすると、Hello, World!が表示されます。


非同期処理とコールバック
---
`コールバック`
非同期処理の基本的な方法の一つがコールバック関数です。
```
const fs = require('fs');

function readFileCallback(filePath, callback) {
  fs.readFile(filePath, 'utf8', (err, data) => {
    if (err) {
      callback(err, null);
    } else {
      callback(null, data);
    }
  });
}

readFileCallback('hello.js', (err, data) => {
  if (err) {
    console.error('Error reading file:', err);
  } else {
    console.log('File content:', data);
  }
});
```
コールバック関数は、非同期処理が終了した際に実行される関数です。
この例では、fs.readFileの完了後にコールバックが呼ばれます。

プロミス
---
非同期処理の結果を扱うためのもう一つの方法です。
プロミスを使うことで、非同期処理の結果をより直感的に扱うことができます。

```
const fs = require('fs').promises;

async function readFilePromise(filePath) {
  try {
    const data = await fs.readFile(filePath, 'utf8');
    console.log('File content:', data);
  } catch (err) {
    console.error('Error reading file:', err);
  }
}

readFilePromise('hello.js');
```
async/awaitを使うことで、非同期コードが同期的に見えるように書くことができ、エラーハンドリングも簡単になります。

まとめ
---
Node.jsは、GoogleのV8エンジン上で動作する非同期I/O対応のJavaScriptランタイムです。
サーバーサイドアプリケーションの開発に使われ、イベント駆動型の高性能な処理が可能です。
npmを使って豊富なパッケージを利用し、迅速な開発が行えます。