Edited at

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


はじめに

数年前のある日、友人が興奮気味にNode.jsについて教えてくれました。

「サーバーサイドでJavaScriptが使えるようになった!」

「ちょっとしたバッチ処理とかもJavaScriptで書ける!便利だ!」

それを聞いた当時の私は聞き返しました。

「それってWSHのこと?」

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


WSHとは

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

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

WSHを使えば、Webサーバーを構築することもできるようです。

(詳しくはこちらをご参照ください。)

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


Node.jsとは

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を比べてみましょう。

例えば、こんな感じに2つのファイルがあるとします。

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

WSHだとこんな感じです。


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ならすぐに試せます。便利!

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


command

cscript sample.js


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


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に書いて、以下のコマンドを実行すればよいです。


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というパッケージがあるようですね。どこまでExcelを深くいじれるのかわかりませんが、参考までに記載します。


追記:やっぱりWSHでもES6使える

コメントで教えていただいたのですが、WSHの実行時にMicrosoft Edgeのエンジンを利用するように指定すると、ES6の構文が使えるようになるそうです。

コマンドはこんな感じになります。


command

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


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


まとめ

WSHは、JavaScriptの黎明期を支えたパイオニア的な存在で、とても素晴らしい技術ですが、ざっくりと言えば古い技術です。単にサーバーやPCでJavaScriptを動かしたいだけなら、Node.jsを利用することをオススメします。

ただ、レジストリをいじりたいとか、よりOSに近い部分を編集したいのであれば、WSHは候補としてアリだと思います。