Node.jsとWSHって何が違うの？

# はじめに

数年前のある日、友人が興奮気味にNode.jsについて教えてくれました。
「サーバーサイドでJavaScriptが使えるようになった！」
「ちょっとしたバッチ処理とかもJavaScriptで書ける！便利だ！」

それを聞いた当時の私は聞き返しました。
「それってWSHのこと？」

私と同じような疑問を持っている人もいるかもしれませんので、WSHとNode.jsの違いをまとめてみました。

# WSHとは

WSHはスクリプト実行環境です。**Windows Script Host**の略称です。名前の通り、Windows専用です。シェルスクリプトのようなバッチ処理を実行することができます。

プログラミング言語としては、JScriptとVBScriptが動作します。このJScriptというのが、JavaScriptと互換性があります。

WSHを使えば、Webサーバーを構築することもできるようです。
（詳しくは[こちら](https://kuenishi.hatenadiary.jp/entry/20101013/1286973687)をご参照ください。）

つまり、WSHを使えばサーバーサイドでJavaScriptが使えますし、ちょっとしたバッチ処理とかも書けるんです！WSHすごい！

# Node.jsとは

<img width="200" alt="nodejs-new-pantone-black.png" src="https://qiita-image-store.s3.amazonaws.com/0/221845/f2e93448-d097-a695-e20b-4bcc0b1135c8.png">

Node.jsもスクリプト実行環境です。プログラミング言語としてはJavaScriptが動作します。Node.jsもスクリプトを実行することができますし、Webサーバーを立ち上げることもできます。そのため、過去の私はWSHと勘違いしてしまったのです。

# WSH vs Node.js

結局、WSHとNode.jsって何が違うんでしょうか？比べて行きます。

## WSHはWindows上でしか動かない

Node.jsはクロスプラットフォームですが、WSHは残念ながらWindows上でしか動作しないです。

|       |Windows|Linux|Mac|
|-------|-------|-----|---|
|WSH    |〇     |✘   |✘|
|Node.js|〇     |〇   |〇|

## WSHはWindows標準装備

WSHの最大の利点はWindowsに標準装備されていることです。Windows98からWindows10までであれば、全てに入っています。
それに対し、Node.jsを利用するには環境構築作業が必要です。
例えば、会社の方針でPCに新しいソフトをインストールしてはいけない場合、Node.jsは使えませんが、WSHは使えます。

## WSHはレジストリがいじれる

Node.jsからWindowsのレジストリを操作することは難しいですが、WSHであれば直接編集できます。その分、WSHはセキュリティリスクが非常に高く、数多くのウィルスが作られたそうです。

レジストリが編集できるという点では、WSHはバッチファイルとかPowerShellに近い存在ですね。

ただ、Node.jsはレジストリを直接編集できませんが、cmdとかシェルを経由すれば可能だと思います。

## Node.jsは最新のJavaScriptが使える

WSHで利用できるJScriptは2009年に更新が止まっています。最新版のJScript 5.8は、JavaScript **ES3**相当のようです。
Node.jsなら**ES5**が利用できますし、Babelとか使えば**ES6**も余裕で動作します。

**追記**： WSHでもES6の構文を使う方法があるそうです。詳細は後半に記載しました。

## Node.jsはパッケージ管理が簡単

Node.jsの強みはパッケージの豊富さだと思います。質・量ともに充実しています。パッケージのバージョンや依存関係もnpmで簡単に管理できます。

WSHにはCOM(ActiveX)がありますが、バージョン管理とか依存関係とかは、プログラマーが自分で判断する必要があります。

## サンプルコード

今度はサンプルコードでWSHとNode.jsを比べてみましょう。
例えば、こんな感じに２つのファイルがあるとします。

<img width="143" alt="wsh.png" src="https://qiita-image-store.s3.amazonaws.com/0/221845/8b1eb7fa-760c-b281-066d-3674d1a39f76.png">

file.txtからUTF-8の文字列を取得して表示する処理を実装するとしましょう。

WSHだとこんな感じです。

```JavaScript:WSH
//必要なオブジェクトを読み込み
var stream = new ActiveXObject("ADODB.Stream");

//ファイルの種類を指定。1:バイナリ、2:テキスト
stream.Type = 2;

//文字コードを指定
stream.charset = "UTF-8";

//ストリームを開く
stream.Open();

try {
  //ファイルを読み込む
  stream.LoadFromFile("file.txt");

  //ファイルから全ての文字列を取得する
  var str = stream.ReadText(-1);

  //文字列を表示
  WScript.Echo(str);
} catch (exception) {
  //エラーメッセージを表示
  WScript.Echo("file.txt is not found.");
}

//ストリームを閉じる
stream.Close();
```

これを書いたsample.jsをダブルクリックすれば、スクリプトが実行されます。
Windowsならすぐに試せます。便利！

コマンドラインで実行したければ、こんな感じです。

```powershell:command
cscript sample.js
```

これと似たような処理をNode.jsで書くとこんな感じです。

```JavaScript:Node.js
//必要なモジュールを読み込み
var fs = require("fs");

//ファイルを開いて文字列を取得
fs.readFile("./file.txt", "utf8", (err, str) => {
  //エラー判定
  if (err) {
    //エラーメッセージを表示
    console.log("file.txt is not found.");
  } else {
    //文字列を表示
    console.log(str);
  }
});
```

Node.jsがインストールされている環境であれば、上記のサンプルコードをsample.jsに書いて、以下のコマンドを実行すればよいです。

```powershell:command
node sample.js
```

こうやってサンプルコードを見比べてみると、コードの書き方に多少の時代の差を感じますね。WSHは明示的にOpenとCloseを記述していますが、少し古いなぁと感じます。Node.jsの方は行数も少ないですし、シンプルだと思います。

## 追記：WSHはExcelが編集できる
コメントで教えていただいたので追加します。

Excelの自動化といえば、まずはExcelマクロ（VBA）を思いつきますが、WSHでも簡単に編集可能です。Microsoft公式のCOMを使うのですが、VBAと同等のことができるようです。JScriptではなく、VBScriptを使用した場合、文法もVBAとそっくりだそうです。

Node.jsの場合は、[js-xlsx](https://github.com/SheetJS/js-xlsx)というパッケージがあるようですね。どこまでExcelを深くいじれるのかわかりませんが、参考までに記載します。

## 追記：やっぱりWSHでもES6使える
コメントで教えていただいたのですが、WSHの実行時に**Microsoft Edge**のエンジンを利用するように指定すると、ES6の構文が使えるようになるそうです。
コマンドはこんな感じになります。

```powershell:command
cscript //E:{1b7cd997-e5ff-4932-a7a6-2a9e636da385} sample.js
```

classとか普通に使えて驚きました。ただ、Node.jsと比べると様々な制約があるようですので、使いどころは難しそうです。詳細はコメント欄をご確認ください。

# まとめ
WSHは、JavaScriptの黎明期を支えたパイオニア的な存在で、とても素晴らしい技術ですが、ざっくりと言えば古い技術です。単にサーバーやPCでJavaScriptを動かしたいだけなら、Node.jsを利用することをオススメします。
ただ、レジストリをいじりたいとか、よりOSに近い部分を編集したいのであれば、WSHは候補としてアリだと思います。