LoginSignup
3
3

More than 5 years have passed since last update.

Haxe+JSでClosure Compilerで圧縮可能なコードを出力するための工夫

Last updated at Posted at 2013-11-14

前提としてHaxeでは、以下のような文法で構造体 (匿名オブジェクト) を生成することができます。

hoge.hx
class Main {
    static function main(){
        var user:Dynamic = {
            name : "Nicolas",
            age : 32
        };
    }
}

しかし、この記述方法を使用して出力したjavascriptコードをClosure CompilerのADVANCED_OPTIMIZATIONSで圧縮するとオブジェクトのプロパティがリネームされてしまうため、そのプロパティにクォートされた文字列でアクセスするようなロジックがあると正常に動かなくなります。
このような場合には匿名オブジェクトは使用せず、以下のように記述するとで回避できます。

hoge.hx
class Main {
    static function main(){
        var user:Dynamic = { };
        untyped __js__("user['name'] = \"Nicolas\"");
        untyped __js__("user['age'] = 32");
    }
}

また、外部から読み込んでJSON形式からパースしたオブジェクトにアクセスする場合にも、以下ののように記述すると「response.result」がリネームされてしまうので、

hoge.hx
class Main {
    static function main(){
        var xhr:XMLHttpRequest = new XMLHttpRequest();
        var response:Dynamic = {};
        response = Json.parse(xhr.responseText);
        var result:String = response.result;
    }
}

これも

hoge.hx
class Main {
    static function main(){
        var xhr:XMLHttpRequest = new XMLHttpRequest();
        var response:Dynamic = {};
        response = Json.parse(xhr.responseText);
        var result:String = untyped __js__("(response['result'] != null) ? response['result'] : null");
    }
}

のように記述することでリネームを回避することができます。

js出力したコードを最終的にClosure Compilerで圧縮する際にハマった罠でした。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3