これまでHaxeからCommonJS requireを実現するには、haxelibからnodejsライブラリをインストールする必要があった。しかし、nodejsライブラリに定義されているrequireは戻り値の型がDynamicと定義されていたので、存在しないメソッド呼び出しをしてもコンパイル時にエラーが発生しなかった。
import js.Node;
class Main {
static public function main() {
var fileSystem = Node.require('fs');
fileSystem.thisMethodMustNotExist();
}
}
このことにより型があるというHaxeの強みが失われていたが、3.2.0以降のバージョンでは@:jsRequireアノテーションによりrequireしたモジュールに型を定義できるようになる。
3.2.0はまだリリースされていないのでリポジトリから取得する。OSX, Homebrewで--HEADオプションつけてインストールしている。
$ brew install haxe --HEAD
@:jsRequireはexternシンタックスと併用する。試しにインターフェースが簡単なfs.existsSyncのみを実装してコンパイルしてみる。
@:jsRequire('fs')
extern class FS {
static function existsSync(path:String):Bool;
}
class Main {
static public function main() {
trace(FS.existsSync('/etc/hosts'));
}
}
コンパイルしたら@:jsRequire('fs')アノテーションがrequire('fs')に変換されていることが確認できる。コンパイル成功を確認したら次にわざとメソッド呼び出しをtypoして、コンパイルエラーが発生することを確認しよう。
EventEmitterのようにrequire('events').EventEmitterの形で使いたい場合は、@:jsRequire('events', 'EventEmitter')とアノテーションに第2引数を設定する。