はじめに
数年前のある日、友人が興奮気味に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とは
![nodejs-new-pantone-black.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F221845%2Ff2e93448-d097-a695-e20b-4bcc0b1135c8.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=2829f9b6429d9844b7e116c80f808c22)
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つのファイルがあるとします。
![wsh.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F221845%2F8b1eb7fa-760c-b281-066d-3674d1a39f76.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=9945c34529a997b845f956e6fc89b8c6)
file.txtからUTF-8の文字列を取得して表示する処理を実装するとしましょう。
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ならすぐに試せます。便利!
コマンドラインで実行したければ、こんな感じです。
cscript sample.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に書いて、以下のコマンドを実行すればよいです。
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の構文が使えるようになるそうです。
コマンドはこんな感じになります。
cscript //E:{1b7cd997-e5ff-4932-a7a6-2a9e636da385} sample.js
classとか普通に使えて驚きました。ただ、Node.jsと比べると様々な制約があるようですので、使いどころは難しそうです。詳細はコメント欄をご確認ください。
まとめ
WSHは、JavaScriptの黎明期を支えたパイオニア的な存在で、とても素晴らしい技術ですが、ざっくりと言えば古い技術です。単にサーバーやPCでJavaScriptを動かしたいだけなら、Node.jsを利用することをオススメします。
ただ、レジストリをいじりたいとか、よりOSに近い部分を編集したいのであれば、WSHは候補としてアリだと思います。