Node.js を持ち歩けるようにして、どこでも簡易WEBサーバを起動出来るようにする

Node.jsで便利なライブラリをつくったとしても、お客さまのPCやサーバの本番環境に **Node.jsの実行環境がないケース** もあります。**「Node.jsの実行環境を持ち歩けたらなぁ、、」**ということでググってみたらこの記事が。。

- [Node.js & npm をインストーラー無しで 手軽にはじめる](https://www.cottpic.com/2019/04/use-NodeJS-without-installer.html)

インストーラなどの実行が不要な **解凍すればすぐに使えるNode.js実行環境**の構築手順です。コレを使えば、実行環境ごとZipでアーカイブしたファイルを作成し**作業環境でそれを解凍すればNode.js環境の構築完了**、なんて事ができそうです。

ついでに、そのNode.js上でWebサーバを立ち上げることで、どこでも簡易WEBサーバが起動出来るようにしてみます。

## Node.js実行環境の構築 

[公式](https://nodejs.org/ja/download/)からバイナリをダウンロード。Windows Binary (.zip) の64-bitを選択します。2020/03/15時点「node-v12.16.1-win-x64.zip」が最新版のようです。
ダウンロード後、任意の場所に解凍しましょう。たとえば ``T:\Tools\nodejs_portable``などなど。

さて上記ディレクトリには、``node.exe``などが入っていると思いますが、同じディレクトリに起動コマンド``run.bat``を置いておきます。中身はテキストでこんな感じ。


```console
@echo off
set PATH=%cd%;%PATH%
set NODE_PATH=%cd%\node_modules\npm\node_modules;%cd%\node_modules\npm
cmd
```

いわゆる、このディレクトリにパスを通しているだけです。
基本的な環境構築は以上です。

### 実行してみる

さてエクスプローラ上で ``run.bat`` をダブルクリックして、node.js 実行環境を起動してみましょう。

```console
T:\Tools\nodejs_portable>
```

こんな感じで起動すればOKです。

```console
T:\Tools\nodejs_portable> node --version
v12.16.1

T:\Tools\nodejs_portable> npm --version
6.13.4

T:\Tools\nodejs_portable>
```

一応 Hello Worldを。

```console
T:\Tools\nodejs_portable> mkdir app
T:\Tools\nodejs_portable> cd app
T:\Tools\nodejs_portable\app> type index.js  ← あらかじめメモ帳とかで作成しておきましょう
console.log('Hello World.')

T:\Tools\nodejs_portable\app> node index.js  ←実行
Hello World.

T:\Tools\nodejs_portable\app>
```

実行OKですね。つづいて npm なども動作確認してみます。


```console
(上でつくったappは一旦削除したとして)
T:\Tools\nodejs_portable> mkdir app
T:\Tools\nodejs_portable> cd app
T:\Tools\nodejs_portable\app> npm init -y
Wrote to T:\Tools\nodejs_portable\app\package.json:

{
  "name": "app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
```

下記のような ``index.js`` をつくってみました。

```javascript
T:\Tools\nodejs_portable\app> type index.js
const request = require('request')

request.get('http://www.yahoo.co.jp', (err, res, body) => {
  console.log(body)
})
```

``npm i ``でインストールします。

```console
T:\Tools\nodejs_portable\app> > npm i --save request
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN app@1.0.0 No description
npm WARN app@1.0.0 No repository field.

+ request@2.88.2
added 47 packages from 58 contributors and audited 63 packages in 9.683s
found 0 vulnerabilities

T:\Tools\nodejs_portable\app> node index.js

....  ばばっってYahooのサイトがなんか返ってくればOK

T:\Tools\nodejs_portable\app>
```

OKそうですね！

**-- 注意 --**
いわゆるグローバルインストール``npm install -g xx``について。
グローバルインストールした際は、``T:\Tools\nodejs_portable\node_modules`` にインストールされる想定だったのですが、すでに Node.jsがインストールされている環境のばあいそちらのディレクトリにインストールされてしまいました。

**すでにNode.jsがインストールされている環境では、グローバルインストールは実施しない**方がよさそうです。
ご注意ください。


## 簡易WEBサーバの構築

さて、さいごにWEBサーバです。Node.jsを用いたWEBサーバの構築は
 [[Node.js] 簡単なWebサーバとして静的ファイル配信/ディレクトリ一覧機能のサンプルコード](https://qiita.com/LightSpeedC/items/d2793e9d213e767a8dc8)
ココをまるまる参考にさせていただきました！感謝です。

さてやってみます。

```console
(上でつくったappは一旦削除したとして)
T:\Tools\nodejs_portable> mkdir app
T:\Tools\nodejs_portable> cd app
T:\Tools\nodejs_portable\app> npm init -y
Wrote to T:\Tools\nodejs_portable\app\package.json:

{
  "name": "app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

T:\Tools\nodejs_portable\app> npm i --save express
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN app@1.0.0 No description
npm WARN app@1.0.0 No repository field.

+ express@4.17.1
added 50 packages from 37 contributors and audited 126 packages in 10.259s
found 0 vulnerabilities
```

さて ``index.js``(WEBサーバのプログラム)は以下でOKです。単純です。

```javascript
T:\Tools\nodejs_portable\app>type index.js
'use strict';

const express = require('express');

const app = express();
app.use(express.static('./dist'));
app.listen(process.env.PORT || 3000);
```

ポート番号:3000 で、ドキュメントルートを ``./dist`` としたWEBサーバを起動するためのJavaScriptコードが完成です。

疎通のため単純なhtmlを``./dist``配下に配置します。

```console
T:\Tools\nodejs_portable\app> mkdir dist
T:\Tools\nodejs_portable\app> type dist\index.html
<html>
<body>

<h1>テスト</h1>
</body>
</html>
T:\Tools\nodejs_portable\app>
```


### 実行してみる

さてWEBサーバを起動してみます。

```console
T:\Tools\nodejs_portable\app> node index.js
...
```

起動したようです。

別のコマンドプロンプトからアクセスしてみます。(あもちろんWEBブラウザでもよいです)

```console
C:\Users\xx> curl http://localhost:3000/index.html
<html>
<body>

<h1>テスト</h1>
</body>
</html>
```

OKそうですね！ 


例によって、インストールディレクトリ(例だと``T:\Tools\nodejs_portable``ですね) をZip化して持ち運べば、任意の場所で解凍すればOKの、簡易WEBサーバの完成です。静的なWEBサーバですが、ちゃちゃっとつかうフロントのサーバとしては十分でしょう。

おつかれさまでした！


## 関連リンク

- [Node.js公式](https://nodejs.org/ja/download/)
- [Node.js & npm をインストーラー無しで 手軽にはじめる](https://www.cottpic.com/2019/04/use-NodeJS-without-installer.html)
- [[Node.js] 簡単なWebサーバとして静的ファイル配信/ディレクトリ一覧機能のサンプルコード](https://qiita.com/LightSpeedC/items/d2793e9d213e767a8dc8)