haxe没有全局命名空间污染的javascript?

Dag*_*bit 9 javascript haxe global-variables

此问题仅适用于Haxe版本<2.10

我已经了解haxe一段时间了,但直到昨天才真正玩过它.好奇,我决定将showdown.js,一个markdown.pl的javascript端口移植到hax​​e.这非常简单,它生成的javascript似乎运行良好(编辑:如果你想看到它在行动,请在这里查看).

但是,我注意到生成的代码在全局命名空间中转储了大量的东西......更糟糕的是,它通过在不使用关键字的情况下为未声明的标识符分配值来实现它var,所以即使你包装整个事物它们也是全局的有一个封闭.

例如...

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

我设法用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);
 }
}
Run Code Online (Sandbox Code Playgroud)

这是一些非常令人讨厌的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
Run Code Online (Sandbox Code Playgroud)

--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;
Run Code Online (Sandbox Code Playgroud)

小智 7

我使用编译器上命名空间开关来清理那些全局根类型.