这个问题仅适用于Haxe版本< 2.10
我知道Haxe已经有一段时间了,但直到昨天我才真正开始使用它。好奇心驱使下,我决定将showdown.js(一个markdown.pl的JavaScript端口)移植到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;