これまで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引数を設定する。