hagino3000's blog

平成アーカイブス (更新停止)

Server-side JavaScript と CommonJS

Python Hack-a-thon #3でLTした時の資料をslide shareにupしました。Google App EngineでServer-side JSやれるよ、といった内容なのですがスライドの内容が殆ど無いのと、CommonJSとかその辺の説明をおもいっきり省略したので、少し補足。

発表した通りに、nitroというフレームワークを使ってGAE上でjsを動作させようとすると次の知識が前提になってきます。

  • Rhino
  • CommonJS
  • Narwhal
  • jack
  • nitro


以下、それぞれについて簡単な説明を。

Rhino

JavaScriptJava実装。ServletからRhinoを呼んでJavaScriptを実行する事になります。

ダウンロードしたjs.jarを叩けばこんな風にインタプリタ起動できる。

$ java -jar js.jar
Rhino 1.7 release 3 PRERELEASE 2009 04 05
js> [1,2,3,4,5].map(function(a){return a*a});
1,4,9,16,25

CommonJS

GoogleグループのCommonJSグループで議論されているServer-side JavaScriptのための標準仕様。

モジュールをインポートするための文法から、パッケージの配布方法まで、多岐に渡る議論が行われています。

まとめwikiがわかりやすい。

Narwhal

CommonJSの実装の一つ。今の所Rhino用ですが、他のエンジンにも対応している最中とのこと。

Narwhalを使うとこんな感じに、CommonJSで定義されたmoduleが使える。

$ narwhal
Rhino 1.7 release 3 PRERELEASE 2009 04 05
js> var fs = require('file');
js> fs.write('tmp.txt', 'This is temp file'); 
js> quit();

$ < tmp.txt
This is temp file

インストールするとCommonJSのパッケージマネージャである tusk も一緒に入ります。tuskを使うと

$ tusk install narwhal-v8
The following packages will be downloaded and installed:
* narwhal-v8
Downloading: http://github.com/tlrobinson/narwhal-v8/zipball/master
Unzipping: /opt/commonjs/narwhal/zips/narwhal-v8.zip
+ /opt/commonjs/narwhal/packages/narwhal-v8/.gitignore
+ /opt/commonjs/narwhal/packages/narwhal-v8/Makefile
+ /opt/commonjs/narwhal/packages/narwhal-v8/bootstrap.js
+ /opt/commonjs/narwhal/packages/narwhal-v8/include/binary-engine.h
(中略)
Done.

みたいに依存関係の解消とかしつつパッケージのインストールをしてくれます。tusk catalogには出てるけどインストール失敗する奴もあるので、まだ実用レベルでは無い雰囲気ですが……。

jack

CommonJSで仕様が考えられているJSGIの実装。Pythonでいう所のWSGI, Rubyでいう所のRack, Javaでいう所のServlet APIといった感じ。動作には前述のNarwhalが必要。

nitro

jack対応のServer-side JavaScriptフレームワークGoogle App Engineに互換性があります。Safari4に搭載されているJavaScriptエンジンもNitroですが、それとは別物。

nitroの使い方は別のエントリにします。