9

この質問は、Haxe バージョン < 2.10 にのみ適用されます

haxe については以前から知っていましたが、昨日まで実際に遊んだことはありませんでした。好奇心が強いので、 markdown.plの javascript ポートであるshowdown.jsをhaxeに移植することにしました。これは非常に簡単で、生成された JavaScript は正常に動作するようです (編集:実際の動作を見たい場合は、こちらを参照してください)。

しかし、生成されたコードがグローバル名前空間に大量のものをダンプしていることに気付きました...さらに悪いことに、キーワードを使用せずに宣言されていない識別子varに値を割り当てることによってそれを行うため、全体をラップしてもグローバルですクロージャー付き。

例えば...

if(typeof js=='undefined') js = {}
...
Hash = function(p) { if( p === $_ ) return; {
...
EReg = function(r,opt) { if( r === $_ ) return; {
...

私はそのほとんどをsedで片付けることができましたが、次のようなことにも悩まされています:

{
 String.prototype.__class__ = String;
 String.__name__ = ["String"];
 Array.prototype.__class__ = Array;
 Array.__name__ = ["Array"];
 Int = { __name__ : ["Int"]}
 Dynamic = { __name__ : ["Dynamic"]}
 Float = Number;
 Float.__name__ = ["Float"];
 Bool = { __ename__ : ["Bool"]}
 Class = { __name__ : ["Class"]}
 Enum = { }
 Void = { __ename__ : ["Void"]}
}
{
 Math.__name__ = ["Math"];
 Math.NaN = Number["NaN"];
 Math.NEGATIVE_INFINITY = Number["NEGATIVE_INFINITY"];
 Math.POSITIVE_INFINITY = Number["POSITIVE_INFINITY"];
 Math.isFinite = function(i) {
  return isFinite(i);
 }
 Math.isNaN = function(i) {
  return isNaN(i);
 }
}

これはかなり不快な JavaScript です。


質問

グローバルを汚染しない haxe のフォークまたはクローンはありますか? 私が望むものを得るためにhaxeソースを変更する価値はありますか、それとも誰かがすでにこれを解決していますか? グーグルはあまり現れていません。私はどんな提案にもオープンです。その間、私はこれがどんな種類の PHP コードを生成するのか見たくてたまりません... :D


答えは?

私が試したアイデアのいくつかを次に示します。

後処理

これが私の簡単なビルド スクリプトです。ものを取り除くのにはかなり良い仕事をしますが、すべてをキャッチするわけではありません。組み込みのコンストラクター プロトタイプへの変更を削除するのをためらっています。私はそれが物事を壊すと確信しています。すべてを修正するのは少し大変かもしれません。誰かがすでに作業を終えている場合は、最初からやりたくありません...

haxe -cp ~/Projects/wmd-new -main Markdown -js markdown.js

echo "this.Markdown=(function(){ var \$closure, Float;" > markdown.clean.js;

sed "s/^if(typeof js=='undefined') js = {}$/if(typeof js=='undefined') var js = {};/g ;
     s/^\([ \x09]*\)\([\$_a-zA-Z0-9]* = \({\|function\)\)/\1var \2/g ;
      /^[ \x09]*\(else \)\?null;$/d ;
     " markdown.js >> markdown.clean.js

echo "return Markdown}());" >> markdown.clean.js;

java -jar closure/compiler.jar --js markdown.clean.js \
--compilation_level SIMPLE_OPTIMIZATIONS \
> markdown.cc.js

--js-namespace スイッチで問題を解決

名前空間スイッチを指摘してくれた Dean Burge に感謝します。これは私の問題をほとんど解決しましたが、わずかな助けがありました。これが私の現在のビルドスクリプトです。これはすべてのグローバル変数をキャッチすると思います...

NS=N\$

haxe -cp ~/Projects/wmd-new -main Markdown --js-namespace $NS -js markdown.js 

# export our function and declare some vars
echo "this.markdown=(function(){var \$_,\$Main,\$closure,\$estr,js,"$NS"" > markdown.clean.js;

# strip silly lines containing "null;" or "else null;"
sed "/^[ \x09]*\(else \)\?null;$/d ;" markdown.js >> markdown.clean.js

# finish the closure
echo "return "$NS".Markdown.makeHtml}());" >> markdown.clean.js;
4

4 に答える 4

7

コンパイラで名前空間スイッチを使用して、これらのグローバル ルート タイプをクリーンアップします。

于 2010-09-30T09:17:36.867 に答える
3

Haxe は、JavaScript Web アプリケーションで分離された再利用可能なコンポーネントを作成するために使用することを意図したものではありません。これは、コンパイラがすべてのひどいコンパイルに対して標準ライブラリを発行するという事実によって証明されます。JavaScript ターゲットの最も最適な使用法は、アプリケーションを完全に haxe で記述し、型指定されていないブロックを使用して外部のものを呼び出すことです。haxe の出力をフラッシュ クリップのように扱う必要があります。それが実行されている環境に気付かず、それが実行されている唯一のものであると想定します。

または、 with() ブロックでコードをラップしてみてください。

于 2010-09-30T08:13:50.763 に答える
2

名前空間付きの (実験的な) haxe コンパイラがここにあります http://github.com/webr3/haxe

于 2010-09-30T10:51:30.493 に答える
1

JSTM JavaScript ジェネレーター マクロは、さまざまな方法で haxe 出力を最適化します。

  1. JavaScript出力は、タイプごとに個別のファイルに分割されます
  2. これらのファイルは最適化されています
  3. ローダー スクリプトは、必要な型を非同期的にロードします。
  4. 1 つのグローバル変数のみが使用されます: jstm
  5. アプリの実行に実際に必要なコードのみがダウンロードされます
  6. 実行時に新しいタイプをロードできるため、高度にスケーラブルなアプリが可能になります

詳細については、 http://code.google.com/p/jstm/をご覧ください。

于 2010-11-24T21:09:05.057 に答える