Y's note

Web技術・プロダクトマネジメント・そして経営について

本ブログの更新を停止しており、今後は下記Noteに記載していきます。
https://note.com/yutakikuchi/

SpiderMonkeyでのコマンドラインJavascript

Javascriptの実行はWebブラウザ上に限定されたものではない。ターミナル上でもスクリプト言語として実行可能だし、構文チェックも可能。今日はあまり知られていない非ブラウザでのJavascriptの話。SpiderMonkeyをターミナル上で動かすことを中心にまとめる。

SpiderMonkeyとは

install

Macにinstallする方法を挙げる。以下2つのどちらかの方法を採用すれば良い。
sourceからのbuildはmacの場合色々と設定が大変だったのでport installした。

1 portからinstallする

これが一番簡単。

$ sudo port install spidermonkey
2 sourceをdownloadしてbuild

※以下は実行していないが念のためダウンロードとインストールについて記述する。
SpiderMonkey Build Documentation ここを参考に設定する。
Mac OS X Build Prerequisites 設定が結構大変。
autoconf213が必要なのでまずはそれを入れておく。

sudo port install autoconf213

ソースの取得方法は次の通り。※murcurialからの取得が時間がかかる。

  • tarballでの取得
$ wget http://ftp.mozilla.org/pub/mozilla.org/js/js185-1.0.0.tar.gz
$ tar xzf js185-1.0.0.tar.gz
  • murcurialからの取得
$ hg clone http://hg.mozilla.org/mozilla-central/

※ murcurialを操作するhgコマンドが無いと取得できないので設定されていなければportからinstallする。

sudo port install mercurial
  • CVSからの取得
$ cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot login
$ cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot co -l mozilla/js/src mozilla/js/src/config mozilla/js/src/editline mozilla/js/src/fdlibm
  • 取得したsourceをbuildする。公式のドキュメントには色々と書いてあるがここでは最も簡単な方法でのbuildを行う。
$ cd js/src
$ autoconf-2.13
$ ./configure
$ make

コマンドラインでのスクリプト実行

SpiderMonkeyの設定が完了したらjsコマンドがインストールされていることを確認する
$ which js
/opt/local/bin/js
コマンドライン上で実行する。

eオプションを利用する。

$ js -e 'print( 'SpiderMonkey' );'
SpiderMonkey
Syntax Check

sオプションを利用する。構文エラー箇所を教えてくれる。

$ js -s ソースファイル名
ソースファイル名: strict warning: trailing comma is not legal in ECMA-262 object initializers:
ソースファイル名: strict warning: };
ソースファイル名: strict warning: ^
ソースコードを実行する。

jsコマンドの後にファイル名を指定するだけ。

$ js spidermonkey.js
SpiderMonkey

実行ソースコード

#!/opt/local/bin/js

var SpiderMonkey = function() {
    this.name = 'SpiderMonkey';
};

SpiderMonkey.prototype = { 
    echo : function() {
        print( this.name );
    }   
};

var spider = new SpiderMonkey();
spider.echo();
コマンドライン引数を渡す

実行ファイルにコマンドライン引数を渡す方法。js ファイル名 引数1 引数2 引数3

$ js arguments.js Javascript Python Java
Javascript
Python
Java

実行ソースコード

#!/opt/local/bin/js

for(var i=0; i<arguments.length; i++ ) {
    print( arguments[i] );
}

上のように実行ファイルに対して入出力が可能だと例えばHadoopのMap/ReduceにもJavascriptで書けてしまう。

vimにSyntaxCheckを仕込む

この章はおまけ。SpiderMonkeyを利用するとvimと連携してこんな事もできますという感じの内容。

JSLint.vimを利用する

JSLintをvimで使うプラグイン。構文のチェックをしてエラー箇所を教えてくれる。gitにソースが上がっているのでそれを落としてきてrake installする。~/.vimrcにfiletype plugin onを追加する。

$ git clone git://github.com/hallettj/jslint.vim.git
$ cd jslint.vim
$ rake install      
(in /Users/YutaKikuchi/work/src/jslint/jslint.vim)
Installed ftplugin/javascript/jslint.vim to /Users/YutaKikuchi/.vim/ftplugin/javascript/
Installed ftplugin/javascript/jslint/jslint-core.js to /Users/YutaKikuchi/.vim/ftplugin/javascript/jslint/
Installed ftplugin/javascript/jslint/runjslint.js to /Users/YutaKikuchi/.vim/ftplugin/javascript/jslint/
Installed ftplugin/javascript/jslint/runjslint.wsf to /Users/YutaKikuchi/.vim/ftplugin/javascript/jslint/
$ vim ~./vimrc
filetype plugin on

使用した感じ

SyntaxCheckのコマンドをmapする

Pluginを入れると重くなると感じる人もいるだろうし、ある程度コードしてから手動で確認したいという人はvimrcの設定だけで済ませるのもいいかも。次のmap設定をvimrcに仕込む。※この方法では完全なる文法チェックは行われない。

$ vim ~/.vimrc
"syntax check
map ,php <ESC>:!php -l %<CR>
map ,js <ESC>:!js -s %<CR>

vimを開いている時のコマンドモードで",js"と入力すると開いているファイルのSyntaxCheckを行う。以下は実行結果。

arguments.js:7: ReferenceError: test is not defined