読者です 読者をやめる 読者になる 読者になる

タオルケット体操

サツバツいんたーねっと

普通のフロントエンドを書くのにHaxeをしばらく使っての所感

仕事でWebのUIを作るのにしばらくHaxeを使っていたので適当な所感とかをまとめます。

その前になんでTypeScriptじゃなくてHaxeにしたか

まずは言語仕様が綺麗だったから、そして(比較当時の)TypeScriptの仕様が残念だったから。

まぁどうしたって比較しちゃいます。当時TSは出たてでした。
TSはシンタックスシュガーが嫌いな感じだったりするのもそうなんですけど、特にモジュールまわりの仕様が腐ってて「あーこりゃダメだわ」って感じで使うのやめちゃいました。モジュール周りは今でも残念なんですかね。

あとはコンパイルの遅さ、Haxeのほうが歴史が長かった(ので安定して動いてくれそうみたいな雑な考え)、とかそんな感じです。

おすすめできる?

ふつーにフロントのJavaScriptを書きたいのであれば、余計な苦労ばかりすることになるのでHaxeはおすすめしません。素直になれ。

以下理由。

流行ってない

ゲーム業界では結構使われている風なんですけど、普通のWebとかではじぇんじぇん流行ってません。なのでびっくりするくらいモジュールがないです。
なので、Haxe製のJavaScript向けライブラリなんてのはほとんど存在しないですし、JavaScript側のコードを利用するための型定義ファイルもjQueryくらいしか存在しないです。CreateJSとかそっち系は結構出そろってますけど、MVVM系は全滅と言っていいレベルです。
なので、何をやるにしても「まずは自分で作る」みたいな感じになりがちです。Haxeを使うことそれ自体に意義を見いだせるならそれでもいいんですけど、まぁだるいです。

JSとの相互運用性が低い

Haxeの言語仕様は大好きです。少々シンタックスがイモくさかったり、標準ライブラリがおかしかったりすることはあるんですけども、既存言語と比べても相当完成度の高いレベルだと思います。

ですが、JavaScriptとかいうクソ汚い自由度マックス言語との相互運用を行うには自ずと限界があります。
externの自作ひとつとっても、Haxeでは予約語をメソッド名に使うことが出来ないのでPromise.catchが書けない*1とか、その他にも色々と七面倒くさいこと*2が多くて嫌になっちゃいます。
マクロで構文木を好き勝手いじれるマクロマスターなら無理矢理どうこう出来たのかもしれませんですが、ちょっとまだ僕には難易度が高くて疲れちゃいました。

正直、予約語をメソッド名に使えない問題はどうにかしないとJavaScriptをHaxeで書くのは色々(主にPromiseを使うところまわり)辛いです。
TypeScriptと比べて、Haxeの型定義ファイルが圧倒的に少ないのはこれが原因の一つだといって良いんじゃないんですかね。

結局別の言語

まぁこれは書く前からわかってたんでそこまででもないんですが、そんなことを言ってもやっぱり時々気になっちゃいます。
nullとかundefinedとかクロージャのthisの挙動とか、その他諸々、HaxeはTSに比べるとアグレッシブな変換を行います(そこがメリットの一つですし)。ただ、そのせいで時々混乱させられたり、既存のライブラリとの相互運用性が低まったり、余計な学習コストが発生したりするんですねー悲しいですねー。

まとめ

ふつーにサードパーティ使ってふつーにJavaScriptを書きたいなら、生かCoffeeScriptか、型が欲しいならTypeScriptやflowを使うのがいい。結局のところそういうつまらない結論に至りました。
TSはどうにも好きになれないんですけど、まぁでもしっかりしてるし、コミュニティ育ってるし、DefinitelyTypedあるし、そもそもがJavaScriptとの相互運用を考えて作られた言語なのでHaxeみたいなextern書けないみたいな問題にもブチあたらないし、もうTSで書き直してぇ……

逆に言うと「サードパーティなんて使わないぜ全部自分で書く」「色んな環境で動くゲームを作る」「色んな言語で共通して使えるライブラリを作るぜ」みたいなことを目論むのであればHaxeは良い言語であり続けるとおもいます。たぶん。

HaxeでWebSocketを実装した懐かしい記事が出てきてほっこりした。

勉強のためにWebSocketServer実装してた - タオルケット体操

おしまい!

*1:実は方法がなくもない、が無理だと思った方が良い

*2:オーバーロードを定義しまくるとコンパイラが死ぬとか