LoginSignup
37
30

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-27

はじめに

数年前のある日、友人が興奮気味に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

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

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は候補としてアリだと思います。

37
30
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
30